<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> remotes/origin/desync_analysis_all_files



1 Firing rate of IL neurons during glycinergic fiber activation

In these experiments glycinergic fibers were photactivated while the firing rate of individual IL neurons was recorded. Some of the IL cells had very low baseline activity. In order to increase the firing rate of the IL neurons and to detect the effect of the glycinergic fiber activation a small tail pinch was applied. The firing rate of the recorded IL cells decreased during the glycinergic fiber activation.

1.1 Loading data

Loading AP and stimuli times from stimulus and from baseline data to IL_stim_firing and to IL_baseline_firing tables:

IL_stim_firing <- CreateRecTibble(AP_times = read_csv(file.path("data",
    "IL_MFR", "stimulus", "AP_times.csv")),
    stim_times = read_csv(file.path("data",
        "IL_MFR", "stimulus", "stim_times.csv")))
IL_stim_firing %>%
    head()
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files
IL_baseline_firing <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "IL_MFR", "baseline", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "IL_MFR", "baseline", "stim_times.csv"))
)
IL_stim_firing %>% head()
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



1.2 Summary information

Summary information of the stimulus and baseline recording files:

  • Variables:
    • file names (file_name)
    • number of channels in the raw recording files (No_ch)
    • number of APs (No_AP_unit, No_AP_unit2)
    • number of stimulus trains (No_Stim)
    • LFP sampling rate (samp_rate_lfp)
    • unit sampling rate (samp_rate_unit)
    • length of the recording (rec_length)
    • length of the stimulus trains (No_trains)
    • Are the lengths of the stimulus trains equal in the recording (train_length_equal)
    • starting time of the stimulus trains (train_start)
    • ending time of the stimulus trains (train_end)
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files


<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files


CELL_INFO table to store the cell categories. It was created manually using the information from the summary excel table (Glicy_juxta-fm_exp_records_injection_sum.xls)

  • Variables
    • cell identification (cell_id). To find the recording file use the summary excel table
    • file names (file_name)
    • spontaneously active cells (bl_activity)
    • induced firing (pinch)
    • individually identified neurons (ident)
    • control cells (control)
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



1.3 Calculations

1.3.1 Firing rates

b_d_a_MFR: Calculating the number of APs -using a custom made function (BDACalculator)- before during and after the stimulus trains (b_d_a_MFR).

b_d_a_MFR <- lapply(CELL_INFO$cell_id, BDACalculator, data = IL_stim_firing) %>%
  bind_rows() %>%
  dplyr::mutate(FR = No_AP / train_length) %>%
  dplyr::group_by(stim_cond, cell_id) %>%
  dplyr::summarise(MFR = mean(FR))
<<<<<<< HEAD <<<<<<< HEAD
`as.tibble()` was deprecated in tibble 2.0.0.
Please use `as_tibble()` instead.
The signature and semantics have changed, see `?as_tibble`.`summarise()` has grouped output by 'stim_cond'. You can override using the `.groups` argument.
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files


sd_mean_isi: Calculating the baseline MFR of the recorded IL cells from the IL_baseline_firing table using a custom made function (SDMeanISI). The results are stored in the sd_mean_isi table.


1.3.2 Ranks (strength of inhibition)

cellranks: Calculating ranks based on the activity change from “baseline” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:




\[\mathbf{activity\_change} = \frac{during\_MFR - base\_MFR}{base\_MFR} * 100\]

cellranks <- b_d_a_MFR %>%
  dplyr::group_by(stim_cond) %>%
  dplyr::mutate(base_MFR = sd_mean_isi$MFR) %>%
  dplyr::mutate(activity_change = ((MFR - base_MFR) / base_MFR * 100) %>% round(2)) %>%
  dplyr::filter(stim_cond == "d") %>%
  dplyr::mutate(change_rank = ifelse(activity_change > 0,
    rank(activity_change),
    -rank(-activity_change)
  )) %>%
  ungroup() %>%
  left_join(CELL_INFO %>%
    select(cell_id, control, pinch, position),
  by = "cell_id"
  )
cellranks
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

cellranks_before_stim: Calculating ranks based on the activity change from “before stimulus” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:




\[\mathbf{activity\_change} = \frac{during\_MFR - before\_MFR}{before\_MFR} * 100\]

cellranks_before_stim <- b_d_a_MFR %>%
  spread(key = stim_cond, value = MFR) %>%
  dplyr::mutate(activity_change = ((d - b) / b * 100) %>% round(2)) %>%
  dplyr::mutate(change_rank = ifelse(activity_change > 0,
    rank(activity_change),
    -rank(-activity_change)
  )) %>%
  left_join(CELL_INFO %>%
    select(cell_id, control, pinch, position),
  by = "cell_id"
  )
cellranks_before_stim
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



1.3.3 Data to plot

TO_PLOT: Combining b_d_a_MFR (firing rate of 29 IL neurons b/d/a stim) with sd_mean_isi table (baseline firing rate of the same 29 neurons), joining with CELL_INFO containing important information of the cells (baseline activity, identified, pinched, control) and with cellranks containing the ranks asigned to each cells based on the changes in MFR during the stimulus compared to baseline.

TO_PLOT <- bind_rows(
  sd_mean_isi %>%
    select(MFR, cell_id, stim_cond),
  b_d_a_MFR
) %>%
  left_join(CELL_INFO %>%
    select(-file_name),
  by = "cell_id"
  ) %>%
  left_join(cellranks %>%
    select(cell_id, change_rank, activity_change),
  by = "cell_id"
  )

datatable(TO_PLOT,
  caption = "TO_PLOT table",
  rownames = TRUE,
  options = list(pageLength = 50, scrollX = T, scrollY = "500px", dom = "t")
)
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



1.4 Plotting

1.4.1 Baseline vs. “before” stimulus activity

Comparison of baseline and “before” stimulus firing rates in the case of spontaneously active and sponteneously inactive (pinch) neurons. Spontaneously inactive neurons showed significantly higher MFR before stiulus compared to baseline.

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



1.4.2 MFR before, during and after stimulus

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



1.4.3 Strength of inhibition

Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files



Plotting the change in MFR from “baseline” to “during stimulus”. Coloring based on the strength of the inhibition (rank)

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files













2 Activity of PRF glycinergic cells during PFC photoactivation

In these experiments we tested the effect of cortical photo-activation on the firing of PRF glycinergic neurons.

2.1 Loading and transforming (hidden code) data

source(file.path("supplementary_functions", "CreateRecTibble.R"))
RECORDINGS <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "cortical_stim", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "cortical_stim", "stim_times.csv"))
)


### CAREFUL WITH THIS!! It's generated by the "CreatePSTHTibble" function but the frequencies have to be changed manually, and it can create duplicates! I have to work on that!
STIM_RESULTS <- read_csv(file.path("output_data", "cortical_stim_analysis.csv"))
  • List of tibbles used to store data:
    • RECORDINGS tibble: stores AP and stim time stamps, number of stimuli in each train, stimulus frequency categories (eg. 8 10 and 12 Hz belong to 10 Hz category)
    • STIM_RESULTS: stores the data for PSTHs (CAREFUL WITH THIS!! It’s generated by the “CreatePSTHTibble” function but the frequencies have to be changed manually, and it can create duplicates! I have to work on that! If something doesn’t look right on PSTHs or response probability plots, check this one first)
    • hist_stats: stores PSTH statistics calculated from ggplot
    • RESP_PROB: response probability and latency data calculated from stim results and recordings
    • APC: number of APs after each stimulus in a 50 ms window
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files <<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files <<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files <<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files <<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

2.2 Plotting

2.2.1 Distribution of frist APs after cortical activation

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

2.2.2 PSTH @ 1 Hz cortical activation

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

2.2.3 PSTH @ 10 Hz cortical activation

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

2.2.4 PSTH @ 20 Hz cortical activation

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

2.2.5 Response probability and latency

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files <<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

2.2.6 Number of APs after each stimulus in stimulus trains (50 ms window)

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files <<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

3 Spontaneous desynchronization of the FC slow oscillation

3.1 Loading data

Loading mat files to file_list object

Example file: 08_right_PnO_t5_4083_baseline1_wake.mat"

Content of mat files:

  • AP channel
    • title: channel name
    • comment: notes about the channel
    • resolution: 2.5e-06
    • interval: time between two data points in sec (5e-05)
    • scale: scaling factor (y scale), real = (data * scale) + offset
    • offset: scale offset
    • units: unit of the channel (volt)
    • length: number of APs
    • items: No. points easch AP is represented by
    • trigger:
    • traces:
    • times: times of the APs (first data point of the waveform)
    • codes: marker codes of the APs
    • values: matrix containing the waveforms of the APs (described by a given No. points)
  • EEG channel
    • title: channel name
    • comment:
    • interval:
    • scale: scaling factor (y scale), real = (data * scale) + offset
    • offset: scale offset
    • units:
    • start:
    • length:
    • values:
file_to_load <- file_list[[1]]
filename <- as.character(substring(file_to_load, 1, nchar(file_to_load) - 4))
raw.rec <- readMat(file.path("data", file_to_load))

### takes the first AP (first row) and tells the index of point with the max value
points_to_peak <- which(raw.rec$ap[, , 1]$values[1, ] ==
  max(raw.rec$ap[, , 1]$values[1, ])) %>%
  as.numeric()

### time of the peak of the APs after its first point
raw.rec$ap[, , 1]$interval * points_to_peak

ap <- raw.rec$ap[, , 1]$times %>% as.double()
ap_peaks <- tibble(peak_times = (ap + c(raw.rec$ap[, , 1]$interval * points_to_peak)))

Loading all data calculated by SyncDesyncAnalysis function

3.2 Plotting

3.2.1 ISI to determine clusters

3.2.2 LFP and APs

3.2.3 Number of clusters in sync vs desync periods

<<<<<<< HEAD =======
>>>>>>> remotes/origin/desync_analysis_all_files

4 Terminals

4.1 Loading data

file_path <- file.path("data",
    "Emi_terminals", "terminal_measures.csv")
TERMINALS <- read.table(file = file_path,
    sep = ";", header = T, na.string = "na")
head(TERMINALS)
<<<<<<< HEAD <<<<<<< HEAD
======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

4.2 Bouton area on different dendritic domains

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files

4.3 Area of boutons with m2 and unknown origin

<<<<<<< HEAD <<<<<<< HEAD

======= >>>>>>> remotes/origin/desync_analysis_all_files ======= >>>>>>> remotes/origin/desync_analysis_all_files













5 Methods

R R Core Team (2021). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

ggplot2 H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.

tidyverse Wickham et al., (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686

<<<<<<< HEAD <<<<<<< HEAD
LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIsIEVtaWxpYSBCb3N6LCBMYXN6bG8gQWNzYWR5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB0cnVlDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQpzcGFjaW5nOiBzaW5nbGUNCmZvbnRzaXplOiAxMnB0DQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KDQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC1mYW1pbHk6ICJBcmlhbCIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzRkNGU0ZjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgzIHsgLyogSGVhZGVyIDMgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShSLm1hdGxhYikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoc3R5bGVyKQ0KbGlicmFyeShmb3JtYXRSKQ0KDQpsaWJyYXJ5KGJzcGVjKSAjIyMgcG93ZXIgc3BlY3RydW0NCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KGRpcHRlc3QpICMjIyB0byB0ZXN0IGRpc3RyaWJ1dGlvbiB1bmkvbXVsdGltb2RhbGl0eSAoSVNJKQ0KbGlicmFyeShleGFjdFJhbmtUZXN0cykgIyMjIHdpbGNveC50ZXN0IGZvciB0aWVzDQpsaWJyYXJ5KFdhdmVsZXRDb21wKSAjIyMgd2F2ZWxldA0KbGlicmFyeShzaWduYWwpDQoNCmxpYnJhcnkoU1RBUikNCmxpYnJhcnkoc2VlKSAjIGZvciBoYWxmIHZpb2xpbnBsb3QNCmxpYnJhcnkoZ2doYWx2ZXMpICMgZm9yIGhhbGYgdmlvbGlucGxvdA0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IFRSVUUsIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmID0gMzApKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KDQoNCiMgRmlyaW5nIHJhdGUgb2YgSUwgbmV1cm9ucyBkdXJpbmcgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbg0KDQpJbiB0aGVzZSBleHBlcmltZW50cyBnbHljaW5lcmdpYyBmaWJlcnMgd2VyZSBwaG90YWN0aXZhdGVkIHdoaWxlIHRoZSBmaXJpbmcgcmF0ZSBvZiBpbmRpdmlkdWFsIElMIG5ldXJvbnMgd2FzIHJlY29yZGVkLiBTb21lIG9mIHRoZSBJTCBjZWxscyBoYWQgdmVyeSBsb3cgYmFzZWxpbmUgYWN0aXZpdHkuIEluIG9yZGVyIHRvIGluY3JlYXNlIHRoZSBmaXJpbmcgcmF0ZSBvZiB0aGUgSUwgbmV1cm9ucyBhbmQgdG8gZGV0ZWN0IHRoZSBlZmZlY3Qgb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24gYSBzbWFsbCB0YWlsIHBpbmNoIHdhcyBhcHBsaWVkLiBUaGUgZmlyaW5nIHJhdGUgb2YgdGhlIHJlY29yZGVkIElMIGNlbGxzIGRlY3JlYXNlZCBkdXJpbmcgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24uIA0KDQoNCiMjIExvYWRpbmcgZGF0YQ0KDQoNCkxvYWRpbmcgQVAgYW5kIHN0aW11bGkgdGltZXMgZnJvbSAqc3RpbXVsdXMqIGFuZCBmcm9tICpiYXNlbGluZSogZGF0YSB0byAqKklMX3N0aW1fZmlyaW5nKiogYW5kIHRvICoqSUxfYmFzZWxpbmVfZmlyaW5nKiogdGFibGVzOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KSUxfc3RpbV9maXJpbmcgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiQVBfdGltZXMuY3N2IikpLA0KICBzdGltX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJzdGltdWx1cyIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KSUxfc3RpbV9maXJpbmcgJT4lIGhlYWQoKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KSUxfYmFzZWxpbmVfZmlyaW5nIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgIkFQX3RpbWVzLmNzdiIpKSwNCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAiYmFzZWxpbmUiLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyBTdW1tYXJ5IGluZm9ybWF0aW9uIA0KDQpTdW1tYXJ5IGluZm9ybWF0aW9uIG9mIHRoZSAqc3RpbXVsdXMqIGFuZCAgKmJhc2VsaW5lKiByZWNvcmRpbmcgZmlsZXM6DQoNCiogVmFyaWFibGVzOg0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmF3IHJlY29yZGluZyBmaWxlcyAoKk5vX2NoKikNCiAgKyBudW1iZXIgb2YgQVBzICgqTm9fQVBfdW5pdCosICpOb19BUF91bml0MiopDQogICsgbnVtYmVyIG9mIHN0aW11bHVzIHRyYWlucyAoKk5vX1N0aW0qKQ0KICArIExGUCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX2xmcCopDQogICsgdW5pdCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX3VuaXQqKQ0KICArIGxlbmd0aCBvZiB0aGUgcmVjb3JkaW5nICgqcmVjX2xlbmd0aCopDQogICsgbGVuZ3RoIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpOb190cmFpbnMqKQ0KICArIEFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zIGVxdWFsIGluIHRoZSByZWNvcmRpbmcgKCp0cmFpbl9sZW5ndGhfZXF1YWwqKQ0KICArIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKnRyYWluX3N0YXJ0KikNCiAgKyBlbmRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fZW5kKikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSB9DQoNCmluZm9fc3RpbSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgInN0aW11bHVzIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX3N0aW0sDQogIGNhcHRpb24gPSAiU3VtbWFyeSB0YWJsZSBvZiB0aGUgc3RpbXVsdXMgcmVjb3JkaW5nIGZpbGVzIChpbmZvX3N0aW0pIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCjxicj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaW5mb19iYXNlbGluZSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX2Jhc2VsaW5lLA0KICBjYXB0aW9uID0gIlN1bW1hcnkgdGFibGUgb2YgdGhlIGJhc2VsaW5lIHJlY29yZGluZyBmaWxlcyAoaW5mb19iYXNlbGluZSkiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj4NCg0KKipDRUxMX0lORk8qKiB0YWJsZSB0byBzdG9yZSB0aGUgY2VsbCBjYXRlZ29yaWVzLiBJdCB3YXMgY3JlYXRlZCBtYW51YWxseSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3VtbWFyeSBleGNlbCB0YWJsZSAoKkdsaWN5X2p1eHRhLWZtX2V4cF9yZWNvcmRzX2luamVjdGlvbl9zdW0ueGxzKikNCg0KKiBWYXJpYWJsZXMNCiAgKyBjZWxsIGlkZW50aWZpY2F0aW9uICgqY2VsbF9pZCopLiBUbyBmaW5kIHRoZSByZWNvcmRpbmcgZmlsZSB1c2UgdGhlIHN1bW1hcnkgZXhjZWwgdGFibGUNCiAgKyBmaWxlIG5hbWVzICgqZmlsZV9uYW1lKikNCiAgKyBzcG9udGFuZW91c2x5IGFjdGl2ZSBjZWxscyAoKmJsX2FjdGl2aXR5KikNCiAgKyBpbmR1Y2VkIGZpcmluZyAoKnBpbmNoKikNCiAgKyBpbmRpdmlkdWFsbHkgaWRlbnRpZmllZCBuZXVyb25zICgqaWRlbnQqKQ0KICArIGNvbnRyb2wgY2VsbHMgKCpjb250cm9sKikNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIyBDRUxMIElORk8gdG8gc3RvcmUgY2F0ZWdvcmllcyAoc3BvbnRhbmVvdXNseSBhY3RpdmUsIGluZHVjZWQgZmlyaW5nLCBpZGVudGlmaWVkKQ0KQ0VMTF9JTkZPIDwtIGluZm9fYmFzZWxpbmUgJT4lDQogIHNlbGVjdChmaWxlX25hbWUpICU+JQ0KICBhZGRfY29sdW1uKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19iYXNlbGluZSRmaWxlX25hbWUsIDEsIDYpLCAuYmVmb3JlID0gImZpbGVfbmFtZSIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGJsX2FjdGl2aXR5ID0gVCkgJT4lDQogIGRwbHlyOjptdXRhdGUoYmxfYWN0aXZpdHkgPSByZXBsYWNlKA0KICAgIGJsX2FjdGl2aXR5LA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIsDQogICAgRg0KICApKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwaW5jaCA9IFQpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBpbmNoID0gcmVwbGFjZSgNCiAgICBwaW5jaCwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE5IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoaWRlbnQgPSBUKSAlPiUNCiAgZHBseXI6Om11dGF0ZShpZGVudCA9IHJlcGxhY2UoDQogICAgaWRlbnQsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjciLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY29udHJvbCA9IEYpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNvbnRyb2wgPSByZXBsYWNlKA0KICAgIGNvbnRyb2wsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI5IiwNCiAgICBUDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gInVua25vd24iKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDExIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiLA0KICAgICJJTCINCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUocG9zaXRpb24gPSByZXBsYWNlKA0KICAgIHBvc2l0aW9uLA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjIiLA0KICAgICJ0cmFuc2llbnQiDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gcmVwbGFjZSgNCiAgICBwb3NpdGlvbiwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgICJQRiINCiAgKSkNCg0KZGF0YXRhYmxlKENFTExfSU5GTywNCiAgY2FwdGlvbiA9ICJDRUxMX0lORk8gdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQoNCiMgSUxfc3RpbV9maXJpbmckZmlsZV9uYW1lICU+JSB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkNCiMgaW5mb19zdGltJGZpbGVfbmFtZSAlPiUgbGVuZ3RoKCkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIENhbGN1bGF0aW9ucw0KIyMjIEZpcmluZyByYXRlcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMjIyBDQUxDVUxBVElORyAtLS0tLS0tLQ0KDQpJTF9zdGltX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfc3RpbV9maXJpbmcsDQogIGluZm9fc3RpbSAlPiUNCiAgICBzZWxlY3QoDQogICAgICBmaWxlX25hbWUsDQogICAgICByZWNfbGVuZ3RoLA0KICAgICAgdHJhaW5fc3RhcnRzLA0KICAgICAgdHJhaW5fZW5kcywNCiAgICAgIHRyYWluX2xlbmd0aA0KICAgICksDQogIGJ5ID0gImZpbGVfbmFtZSINCikNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW0gc3RhcnQgdGltZXMNCnN0YXJ0X3RpbWVzIDwtIElMX3N0aW1fZmlyaW5nICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZmlsZV9uYW1lKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY2VsbF9pZCA9IHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjpncm91cF9ieShjZWxsX2lkKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSkgJT4lDQogIHB1bGwodHJhaW5fc3RhcnRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbSBlbmQgdGltZXMNCmVuZF90aW1lcyA8LSBJTF9zdGltX2ZpcmluZyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fc3RhcnRzID0gdW5pcXVlKHRyYWluX3N0YXJ0cyksIHRyYWluX2VuZHMgPSB1bmlxdWUodHJhaW5fZW5kcykpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIHB1bGwodHJhaW5fZW5kcykgJT4lDQogIHN0cnNwbGl0KCIsIikgJT4lDQogIHNldF9uYW1lcyhzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBsYXBwbHkoYXMubnVtZXJpYykNCg0KDQpjZWxsX2xpc3QgPC0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpDQpDRUxMX0lORk8kY2VsbF9pZA0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIEFQIGIvZC9hIHN0aW0uIEFyZ3VtZW50czogZGF0YSAoSUxfc3RpbV9maXJpbmcgdGFibGUgd2l0aCByZWNfbGVuZ3RoIGFuZCBzdGltdWx1cyB0cmFpbiBpbmZvcm1hdGlvbikNCkJEQUNhbGN1bGF0b3IgPC0gZnVuY3Rpb24oZGF0YSwgbGlzdCkgew0KICBjZWxsX2xpc3QgPC0gbGlzdA0KDQogIHRyYWluX2xlbmd0aCA8LSBkYXRhICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0KSAlPiUNCiAgICBzZWxlY3QodHJhaW5fbGVuZ3RoKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgYFtbYCgxKQ0KDQoNCg0KICBpZiAoDQogICAgKGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3QodW5pdF9pZCkgJT4lDQogICAgICB1bmlxdWUoKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGxlbmd0aCgpKSA9PSAxDQogICkgew0KICAgICMjIyBJbiBjYXNlIG9mIG9uZSB1bml0IGluIHRoZSBmaWxlOg0KICAgIEFQX3RpbWVzIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpDQoNCiAgICBBUF9udW1iZXJzIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnMpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgIDwgQVBfdGltZXMgJiBBUF90aW1lcyA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgQVBfdGltZXMgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNbQVBfdGltZXMgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQogICAgbWVsdChBUF9udW1iZXJzLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgIGFkZF9jb2x1bW4oY2VsbF9pZCA9IGNlbGxfbGlzdCkgJT4lDQogICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgfSBlbHNlIHsNCiAgICAjIyMgaW4gY2FzZSBvZiBtdWx0aXBsZSB1bml0cyBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lc18xIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAxKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMSA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzEpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMVt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18xW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzEgJiBBUF90aW1lc18xIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18xIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMSA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCiAgICBBUF90aW1lc18yIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAyKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMiA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzIpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18yW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzIgJiBBUF90aW1lc18yIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18yIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCg0KICAgIGlmIChjZWxsX2xpc3QgJT4lIHN1YnN0cig1LCA2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDEpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwwIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSAlPiUgbmNoYXIoKSA9PSAyKSB7DQogICAgICBuZXdfbmFtZSA8LSBwYXN0ZTAoDQogICAgICAgICJjZWxsIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBiaW5kX3Jvd3MoDQogICAgICBtZWx0KEFQX251bWJlcnNfMSwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gY2VsbF9saXN0KSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpLA0KDQogICAgICBtZWx0KEFQX251bWJlcnNfMiwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gbmV3X25hbWUpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgICApDQogIH0gIyBlbHNlDQp9ICMgZm9vDQpgYGANCg0KKipiX2RfYV9NRlIqKjogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBBUHMgLXVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpCREFDYWxjdWxhdG9yKiktIGJlZm9yZSBkdXJpbmcgYW5kIGFmdGVyIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpiX2RfYV9NRlIqKS4gDQoNCmBgYHtyfQ0KYl9kX2FfTUZSIDwtIGxhcHBseShDRUxMX0lORk8kY2VsbF9pZCwgQkRBQ2FsY3VsYXRvciwgZGF0YSA9IElMX3N0aW1fZmlyaW5nKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGRwbHlyOjptdXRhdGUoRlIgPSBOb19BUCAvIHRyYWluX2xlbmd0aCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShzdGltX2NvbmQsIGNlbGxfaWQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKE1GUiA9IG1lYW4oRlIpKQ0KYGBgDQoNCjxicj4NCioqc2RfbWVhbl9pc2kqKjogQ2FsY3VsYXRpbmcgdGhlIGJhc2VsaW5lIE1GUiBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZnJvbSB0aGUgKklMX2Jhc2VsaW5lX2ZpcmluZyogdGFibGUgdXNpbmcgYSBjdXN0b20gbWFkZSBmdW5jdGlvbiAoKlNETWVhbklTSSopLiBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHRoZSAqc2RfbWVhbl9pc2kqIHRhYmxlLg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCklMX2Jhc2VsaW5lX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfYmFzZWxpbmVfZmlyaW5nLA0KICBpbmZvX2Jhc2VsaW5lICU+JQ0KICAgIHNlbGVjdChmaWxlX25hbWUsIHJlY19sZW5ndGgpLA0KICBieSA9ICJmaWxlX25hbWUiDQopICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fY29uZCA9ICJiYXNlbGluZSIpDQoNCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgSVNJIG1lYW4gYW5kIFNEIGR1cmluZyBiYXNlbGluZSBhY3Rpdml0eSBvZiB0aGUgY2VsbHMNClNETWVhbklTSSA8LSBmdW5jdGlvbihmX25hbWUpIHsNCg0KDQogICMgbWVhbl9pc2kgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAjICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgIyAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICMgICBwdWxsKCkgJT4lDQogICMgICBkaWZmKCkgJT4lDQogICMgICBtZWFuKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHNkX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIHNkKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHJldHVybihsaXN0KE1GUiA9IG1lYW5faXNpLA0KICAjICAgICAgICAgICAgIFNERlIgPSBzZF9pc2kpKQ0KDQogIHRtcDIgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgZGlmZigpICU+JQ0KICAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICAgICB0aWJibGUobWVhbl9pc2kgPSAuKQ0KICB0bXAyICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc2RfaXNpID0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBkaWZmKCkgJT4lDQogICAgICBzZCgpICogMTAwMCkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmaWxlX25hbWUgPSBmX25hbWUpDQp9DQoNCnNkX21lYW5faXNpIDwtIGxhcHBseShpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgU0RNZWFuSVNJKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFzLnRpYmJsZSgpDQoNCnNkX21lYW5faXNpIDwtIHNkX21lYW5faXNpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoc2RfbWVhbl9pc2kkZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSID0gMTAwMCAvIG1lYW5faXNpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShTRF9GUiA9IDEwMDAgLyBzZF9pc2kpICU+JQ0KICBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSBNRlIgKyBTRF9GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSX2RlYyA9IE1GUiAtIFNEX0ZSKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSAxMDAwLyhtZWFuX2lzaS1zZF9pc2kpKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9kZWMgPSAxMDAwLyhtZWFuX2lzaStzZF9pc2kpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2NvbmQgPSAiYmFzZWxpbmUiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShNRlJfZGVjID0gcmVwbGFjZShNRlJfZGVjLCBzZF9tZWFuX2lzaSRNRlJfZGVjIDwgMCwgMCkpDQpgYGANCjxicj4NCg0KIyMjIFJhbmtzIChzdHJlbmd0aCBvZiBpbmhpYml0aW9uKQ0KKipjZWxscmFua3MqKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiYXNlbGluZToNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmFzZVxfTUZSfXtiYXNlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KYGBge3J9DQpjZWxscmFua3MgPC0gYl9kX2FfTUZSICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9jb25kKSAlPiUNCiAgZHBseXI6Om11dGF0ZShiYXNlX01GUiA9IHNkX21lYW5faXNpJE1GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoYWN0aXZpdHlfY2hhbmdlID0gKChNRlIgLSBiYXNlX01GUikgLyBiYXNlX01GUiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihzdGltX2NvbmQgPT0gImQiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JQ0KICAgIHNlbGVjdChjZWxsX2lkLCBjb250cm9sLCBwaW5jaCwgcG9zaXRpb24pLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQpjZWxscmFua3MNCmBgYA0KDQoNCg0KKipjZWxscmFua3NfYmVmb3JlX3N0aW0qKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmVmb3JlIHN0aW11bHVzKiIgdG8gIipkdXJpbmcgc3RpbXVsdXMqIi4gSWYgdGhlIGFjdGl2aXR5IGNoYW5nZSBpcyBuZWdhdGl2ZSAoZGVjcmVhc2VkIE1GUikgdGhlIGFzaWduZWQgcmFuayBpcyBuZWdhdGl2ZSwgaWYgaXQgaXMgcG9zaXRpdmUgKGluY3JlYXNlZCBNRlIpIHRoZSBhc3NpZ25lZCByYW5rIGlzIHBvc2l0aXZlLg0KDQo8YnI+DQoNCkNhbGN1bGF0aW5nIHRoZSBmaXJpbmcgcmF0ZSBjaGFuZ2UgZHVyaW5nIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gYmVmb3JlIHN0aW11bHVzOg0KDQo8YnI+PGJyPjxicj4NCg0KJCRcbWF0aGJme2FjdGl2aXR5XF9jaGFuZ2V9ID0gXGZyYWN7ZHVyaW5nXF9NRlIgLSBiZWZvcmVcX01GUn17YmVmb3JlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KDQoNCmBgYHtyfQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltIDwtIGJfZF9hX01GUiAlPiUNCiAgc3ByZWFkKGtleSA9IHN0aW1fY29uZCwgdmFsdWUgPSBNRlIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGFjdGl2aXR5X2NoYW5nZSA9ICgoZCAtIGIpIC8gYiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoY2VsbF9pZCwgY29udHJvbCwgcGluY2gsIHBvc2l0aW9uKSwNCiAgYnkgPSAiY2VsbF9pZCINCiAgKQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCiMjIyBEYXRhIHRvIHBsb3QNCioqVE9fUExPVCoqOiBDb21iaW5pbmcgKmJfZF9hX01GUiogKGZpcmluZyByYXRlIG9mIDI5IElMIG5ldXJvbnMgYi9kL2Egc3RpbSkgd2l0aCAqc2RfbWVhbl9pc2kqIHRhYmxlIChiYXNlbGluZSBmaXJpbmcgcmF0ZSBvZiB0aGUgc2FtZSAyOSBuZXVyb25zKSwgam9pbmluZyB3aXRoIENFTExfSU5GTyBjb250YWluaW5nIGltcG9ydGFudCBpbmZvcm1hdGlvbiBvZiB0aGUgY2VsbHMgKGJhc2VsaW5lIGFjdGl2aXR5LCBpZGVudGlmaWVkLCBwaW5jaGVkLCBjb250cm9sKSBhbmQgd2l0aCAqY2VsbHJhbmtzKiBjb250YWluaW5nIHRoZSByYW5rcyBhc2lnbmVkIHRvIGVhY2ggY2VsbHMgYmFzZWQgb24gdGhlIGNoYW5nZXMgaW4gTUZSIGR1cmluZyB0aGUgc3RpbXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVE9fUExPVCA8LSBiaW5kX3Jvd3MoDQogIHNkX21lYW5faXNpICU+JQ0KICAgIHNlbGVjdChNRlIsIGNlbGxfaWQsIHN0aW1fY29uZCksDQogIGJfZF9hX01GUg0KKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoLWZpbGVfbmFtZSksDQogIGJ5ID0gImNlbGxfaWQiDQogICkgJT4lDQogIGxlZnRfam9pbihjZWxscmFua3MgJT4lDQogICAgc2VsZWN0KGNlbGxfaWQsIGNoYW5nZV9yYW5rLCBhY3Rpdml0eV9jaGFuZ2UpLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQoNCmRhdGF0YWJsZShUT19QTE9ULA0KICBjYXB0aW9uID0gIlRPX1BMT1QgdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj48YnI+DQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBCYXNlbGluZSB2cy4gImJlZm9yZSIgc3RpbXVsdXMgYWN0aXZpdHkNCg0KQ29tcGFyaXNvbiBvZiBiYXNlbGluZSBhbmQgImJlZm9yZSIgc3RpbXVsdXMgZmlyaW5nIHJhdGVzIGluIHRoZSBjYXNlIG9mIHNwb250YW5lb3VzbHkgYWN0aXZlIGFuZCBzcG9udGVuZW91c2x5IGluYWN0aXZlIChwaW5jaCkgbmV1cm9ucy4gU3BvbnRhbmVvdXNseSBpbmFjdGl2ZSBuZXVyb25zIHNob3dlZCBzaWduaWZpY2FudGx5IGhpZ2hlciBNRlIgYmVmb3JlIHN0aXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJiIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImIiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwaW5jaCksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gcGluY2gpDQogICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsIHBhaXJlZCA9IFQpICsNCiAgZ2VvbV9sYWJlbF9yZXBlbCgNCiAgICBkYXRhID0gVE9fUExPVCAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgICAgc3RpbV9jb25kID09ICJiYXNlbGluZSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIG51ZGdlX3ggPSAtLjksDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgICMgaGp1c3QgPSAyLA0KICAgIHNlZ21lbnQuc2l6ZSA9IC4yDQogICkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgTUZSIGJlZm9yZSwgZHVyaW5nIGFuZCBhZnRlciBzdGltdWx1cyANCg0KYGBge3IsIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD0xMiAsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYiIgfCBzdGltX2NvbmQgPT0gImQiIHwgc3RpbV9jb25kID09ICJhIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImIiLCAiZCIsICJhIiksDQogICAgeSA9IE1GUg0KICApDQopICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gMCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICBnZ3RpdGxlKCJQaW5jaCIsICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICB5bGltKDAsIDM1KSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLA0KICAgIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCksDQogICAgY29sb3IgPSAiI0VCODEwNCINCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIG51ZGdlX3ggPSAwLjE1LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0wLjUsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpDQpgYGANCjxicj48YnI+DQoNCiMjIyBTdHJlbmd0aCBvZiBpbmhpYml0aW9uDQoNCkZpcmluZyByYXRlIGNoYW5nZSAqKmR1cmluZyoqIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gKipiYXNlbGluZSoqOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBjZWxscmFua3MsDQogIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKQ0KKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gRiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKA0KICAgIGRhdGEgPSBjZWxscmFua3MgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICkgKw0KDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHlsaW0oLW1heChjZWxscmFua3MkYWN0aXZpdHlfY2hhbmdlKSwgbWF4KGNlbGxyYW5rcyRhY3Rpdml0eV9jaGFuZ2UpKQ0KYGBgDQoNCjxicj48YnI+DQoNCkZpcmluZyByYXRlIGNoYW5nZSAqKmR1cmluZyoqIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gKipiZWZvcmUqKiBzdGltdWx1czoNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KDQpnZ3Bsb3QoDQogIGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0sDQogIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKQ0KKSArDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoY29udHJvbCA9PSBGKSwgc2l6ZSA9IDYsDQogICAgYWVzKA0KICAgICAgY29sID0gcG9zaXRpb24sDQogICAgICBzaGFwZSA9IHBpbmNoDQogICAgKQ0KICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIklMIiA9ICJncmVlbiIsICJ0cmFuc2llbnQiID0gImJsdWUiLCAiUEYiID0gInJlZCIsICJ1bmtub3duIiA9ICJibGFjayIsICJjb250cm9sIiA9ICJtYWdlbnRhIikpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gIisiLCAiRkFMU0UiID0gIi0iKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lDQogICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IFQpLCBzaXplID0gMywgY29sID0gIm1hZ2VudGEiKSArDQogICMjIyBsYWJlbCBmb3IgbmVnYXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPCAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgYW5nbGUgPSA5MCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3kgPSAtMg0KICApICsNCg0KICAjIyMgbGFiZWwgZm9yIHBvc2l0aXZlIHZhbHVlcw0KICBnZW9tX3RleHRfcmVwZWwoDQogICAgZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoYWN0aXZpdHlfY2hhbmdlID4gMCksDQogICAgYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgZGlyZWN0aW9uID0gIngiLA0KICAgIGFuZ2xlID0gMCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3ggPSAtMQ0KICApICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyNywgeSA9IC0xNywgbGFiZWwgPSAiQmFzZWxpbmUgYWN0aXZpdHkiLCBjb2wgPSAiZ3JheSIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMiwgeSA9IDI4MCwgbGFiZWwgPSAiTmVnYXRpdmUgcmFuazogRlIgZGVjcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMiwgeSA9IDI4MCwgbGFiZWwgPSAiUG9zaXRpdmUgcmFuazogRlIgaW5jcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSYW5rcyIpICsNCiAgeWxhYigiQ2hhbmdlIGluIGZpcmluZyByYXRlIFslXSIpICsNCiAgeWxpbSgtbWF4KGNlbGxyYW5rc19iZWZvcmVfc3RpbSRhY3Rpdml0eV9jaGFuZ2UpLCBtYXgoY2VsbHJhbmtzX2JlZm9yZV9zdGltJGFjdGl2aXR5X2NoYW5nZSkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCjxicj48YnI+DQoNClBsb3R0aW5nIHRoZSBjaGFuZ2UgaW4gTUZSIGZyb20gIipiYXNlbGluZSoiIHRvICIqZHVyaW5nIHN0aW11bHVzKiIuIENvbG9yaW5nIGJhc2VkIG9uIHRoZSBzdHJlbmd0aCBvZiB0aGUgaW5oaWJpdGlvbiAoKnJhbmsqKQ0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEyLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIiB8IHN0aW1fY29uZCA9PSAiZCINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiYXNlbGluZSIsICJkIiwgImEiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBjaGFuZ2VfcmFuayksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gY2hhbmdlX3JhbmspDQogICkgKw0KICBnZW9tX2xhYmVsX3JlcGVsKA0KICAgIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcigNCiAgICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIg0KICAgICAgKSwNCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gY2VsbF9pZCwgY29sID0gY2hhbmdlX3JhbmspLA0KICAgICMgbnVkZ2VfeCA9IC0uMSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgaGp1c3QgPSA0LA0KICAgIHNlZ21lbnQuc2l6ZSA9IC4yDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIGxhYnMoZmlsbCA9ICJSYW5rIiwgY29sID0gIlJhbmsiKQ0KYGBgDQoNCg0KDQoNCg0KDQo8YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj4NCg0KDQojIEFjdGl2aXR5IG9mIFBSRiBnbHljaW5lcmdpYyBjZWxscyBkdXJpbmcgUEZDIHBob3RvYWN0aXZhdGlvbg0KDQpJbiB0aGVzZSBleHBlcmltZW50cyB3ZSB0ZXN0ZWQgdGhlIGVmZmVjdCBvZiBjb3J0aWNhbCBwaG90by1hY3RpdmF0aW9uIG9uIHRoZSBmaXJpbmcgb2YgUFJGIGdseWNpbmVyZ2ljIG5ldXJvbnMuICANCg0KDQojIyBMb2FkaW5nIGFuZCB0cmFuc2Zvcm1pbmcgKGhpZGRlbiBjb2RlKSBkYXRhDQoNCg0KYGBge3IgbG9hZGluZyBkYXRhLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiQ3JlYXRlUmVjVGliYmxlLlIiKSkNClJFQ09SRElOR1MgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJjb3J0aWNhbF9zdGltIiwgIkFQX3RpbWVzLmNzdiIpKSwNCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJjb3J0aWNhbF9zdGltIiwgInN0aW1fdGltZXMuY3N2IikpDQopDQoNCg0KIyMjIENBUkVGVUwgV0lUSCBUSElTISEgSXQncyBnZW5lcmF0ZWQgYnkgdGhlICJDcmVhdGVQU1RIVGliYmxlIiBmdW5jdGlvbiBidXQgdGhlIGZyZXF1ZW5jaWVzIGhhdmUgdG8gYmUgY2hhbmdlZCBtYW51YWxseSwgYW5kIGl0IGNhbiBjcmVhdGUgZHVwbGljYXRlcyEgSSBoYXZlIHRvIHdvcmsgb24gdGhhdCENClNUSU1fUkVTVUxUUyA8LSByZWFkX2NzdihmaWxlLnBhdGgoIm91dHB1dF9kYXRhIiwgImNvcnRpY2FsX3N0aW1fYW5hbHlzaXMuY3N2IikpDQpgYGANCg0KDQpgYGB7ciB0cmFuc2Zvcm1pbmcgZGF0YSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBhZGRpbmcgc3RpbXVsdXMgbnVtYmVyIHdpdGhpbiB0cmFpbg0KUkVDT1JESU5HUyA8LSBSRUNPUkRJTkdTICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fbnVtYmVyID0gMCkNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4NCmluaXRpYWxfdmFsdWUgPC0gUkVDT1JESU5HUyRzdGltX2ZyZXFbMV0gJT4lDQogIGBjb21tZW50PC1gKCJGaXJzdCB2YWx1ZSBvZiBzdGltX2ZyZXEgdmFyaWFibGUuIFdoZW4gaXQgY2hhbmdlcyBzdGltdWx1cyBjb3VudGluZyByZXN0YXJ0cyIpDQoNCnN0aW1fY291bnRlciA8LSAxICU+JQ0KICBgY29tbWVudDwtYCgiQ291bnRzIHN0aW11bGkgaW4gYSB0cmFpbiIpDQppbmRleCA8LSAxICU+JQ0KICBgY29tbWVudDwtYCgiVHJhY2tzIHRoZSBwb3NpdGlvbiAoaW5kZXgpIG9mIHN0aW1fZnJlcSIpDQoNClJFQ09SRElOR1Mkc3RpbV9udW1iZXJbMV0gPC0gc3RpbV9jb3VudGVyDQpyZXBlYXR7DQogIGlmIChSRUNPUkRJTkdTJHN0aW1fZnJlcVtpbmRleCArIDFdID09IGluaXRpYWxfdmFsdWUpIHsNCiAgICBSRUNPUkRJTkdTJHN0aW1fbnVtYmVyW2luZGV4ICsgMV0gPC0gc3RpbV9jb3VudGVyICsgMQ0KICAgIHN0aW1fY291bnRlciA8LSBzdGltX2NvdW50ZXIgKyAxDQogICAgaW5kZXggPC0gaW5kZXggKyAxDQogIH0gZWxzZSB7DQogICAgaW5pdGlhbF92YWx1ZSA8LSBSRUNPUkRJTkdTJHN0aW1fZnJlcVtpbmRleCArIDFdDQogICAgc3RpbV9jb3VudGVyIDwtIDENCiAgICBSRUNPUkRJTkdTJHN0aW1fbnVtYmVyW2luZGV4ICsgMV0gPC0gc3RpbV9jb3VudGVyDQogICAgaW5kZXggPC0gaW5kZXggKyAxDQogIH0NCg0KICBpZiAoaW5kZXggPT0gbGVuZ3RoKFJFQ09SRElOR1Mkc3RpbV9udW1iZXIpKSB7DQogICAgYnJlYWsNCiAgfQ0KfQ0KDQojIyMgcmVwbGFjaW5nIHN0aW1fbnVtYmVyIHdpdGggTkEgYXQgIkFQIg0KUkVDT1JESU5HUyRzdGltX251bWJlcltSRUNPUkRJTkdTJHNpZ25hbF90eXBlID09ICJBUCJdIDwtIE5BDQoNCiMjIyBjYXRlZ29yaXppbmcgc3RpbXVsaQ0KUkVDT1JESU5HUyA8LSBSRUNPUkRJTkdTICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHN0aW1fZnJlcSkgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gcmVwbGFjZSgNCiAgICB4ID0gc3RpbV9mcmVxX2NhdGVnLA0KICAgIGxpc3QgPSAoc3RpbV9mcmVxX2NhdGVnID09IDEyIHwgc3RpbV9mcmVxX2NhdGVnID09IDgpLA0KICAgIHZhbHVlcyA9IDEwDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxOCksDQogICAgdmFsdWVzID0gMjANCiAgKSkNCmBgYA0KDQpgYGB7ciBjYWxjdWxhdGluZyBoaXN0IHN0YXRzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiSGlzdFN0YXRzLlIiKSkNCg0KU1RJTV9SRVNVTFRTICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZnJlcSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2Uobl90aW1lcyA9IGxlbmd0aCh1bmlxdWUoYW5pbWFsX2lkKSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGFzLm1hdHJpeCgpICU+JQ0KICB1bm5hbWUoKSAtPiByZXBfbWF0cml4DQoNCiMjIyBzZXQgUFNUSCByYW5nZQ0KUFNUSF9yYW5nZSA8LSBjKC0wLjAxLCAwLjA0KQ0KDQoNCmhpc3Rfc3RhdHMgPC0gU1RJTV9SRVNVTFRTICU+JQ0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0NCiAgKSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGZyZXEpICU+JQ0KICBkbyhncF9oaXN0ID0gZ2dwbG90KA0KICAgIGRhdGEgPSAuLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KICApICsNCiAgICB4bGltKFBTVEhfcmFuZ2VbMV0sIFBTVEhfcmFuZ2VbMl0pICsNCiAgICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IGFuaW1hbF9pZCksIGJpbndpZHRoID0gMC4wMDEpICsNCiAgICBzY2FsZV9maWxsX2JyZXdlcigNCiAgICAgIHBhbGV0dGUgPSAiU2V0MyIsDQogICAgICBuYW1lID0gIkFuaW1hbCINCiAgICAgICMgZ3VpZGUgPSBGQUxTRQ0KICAgICkgKw0KICAgIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArDQogICAgeGxhYigiVGltZSAocykiKSArDQogICAgeWxhYigiQ291bnQiKSArDQogICAgZ2d0aXRsZShwYXN0ZTAoLiRmcmVxLCAiIEh6IikpDQogICkgJT4lDQogIGBbW2AoMikgJT4lDQogIGxhcHBseSguICU+JSBIaXN0U3RhdHMoKSAlPiUgYXMudGliYmxlKCkpICU+JQ0KICBiaW5kX3Jvd3MoKSAlPiUNCiAgYWRkX2NvbHVtbigNCiAgICBmcmVxID0gYygNCiAgICAgIHJlcChyZXBfbWF0cml4WzEsIDFdLCByZXBfbWF0cml4WzEsIDJdKSwNCiAgICAgIHJlcChyZXBfbWF0cml4WzIsIDFdLCByZXBfbWF0cml4WzIsIDJdKSwNCiAgICAgIHJlcChyZXBfbWF0cml4WzMsIDFdLCByZXBfbWF0cml4WzMsIDJdKQ0KICAgICksDQogICAgLmFmdGVyID0gImFuaW1hbF9pZCINCiAgKQ0KYGBgDQoNCg0KYGBge3IgY2FsY3VsYXRpbmcgcmVzcG9uc2UgcHJvYiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClJFU1BfUFJPQiA8LSBsZWZ0X2pvaW4oDQogIFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdDQogICAgKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkLCBmcmVxKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX0FQcyA9IGxlbmd0aChmaXJzdF9hcF9yZWx0aW1lcykpICU+JQ0KICAgIGRwbHlyOjpyZW5hbWUoc3RpbV9mcmVxID0gZnJlcSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXEgPSByZXBsYWNlKHN0aW1fZnJlcSwgc3RpbV9mcmVxID09IDE4LCAyMCkpICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxID0gcmVwbGFjZShzdGltX2ZyZXEsIHN0aW1fZnJlcSA9PSA4LCAxMCkpLA0KDQogIFJFQ09SRElOR1MgJT4lDQogICAgZHBseXI6OmZpbHRlcihzaWduYWxfdHlwZSA9PSAic3RpbSIsIHN0aW1fZnJlcV9jYXRlZyAlaW4lIGMoIjEiLCAiMTAiLCAiMjAiKSkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgc3RpbV9mcmVxX2NhdGVnKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX3N0aW0gPSBsZW5ndGgoc2lnbmFsX3RpbWUpKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcSA9IGFzLm51bWVyaWMoc3RpbV9mcmVxX2NhdGVnKSkgJT4lDQogICAgc2VsZWN0KC1zdGltX2ZyZXFfY2F0ZWcpDQopICU+JQ0KICBhZGRfY29sdW1uKE5vX0FQc19yYW5nZSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgYXJyYW5nZShhbmltYWxfaWQpICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoZnJlcSA9IHJlcGxhY2UoZnJlcSwgZnJlcSA9PSAxOCwgMjApKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKGZyZXEgPSByZXBsYWNlKGZyZXEsIGZyZXEgPT0gOCwgMTApKSAlPiUNCiAgICBkcGx5cjo6cmVuYW1lKHN0aW1fZnJlcSA9IGZyZXEpICU+JSBwdWxsKHJhbmdlX2NvdW50X3N1bSkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHJlc3BfcHJvYiA9IChOb19BUHMgLyBOb19zdGltKSAqIDEwMCkgJT4lDQogIGRwbHlyOjptdXRhdGUocmVzcF9wcm9iX3JhbmdlID0gKE5vX0FQc19yYW5nZSAvIE5vX3N0aW0pICogMTAwKSAlPiUNCiAgYWRkX2NvbHVtbihwZWFrX2xhdGVuY3kgPSBoaXN0X3N0YXRzICU+JQ0KICAgIGFycmFuZ2UoYW5pbWFsX2lkKSAlPiUNCiAgICBwdWxsKHBlYWspKSAlPiUNCiAgYWRkX2NvbHVtbihtZWFuX2xhdGVuY3kgPSBoaXN0X3N0YXRzICU+JQ0KICAgIGFycmFuZ2UoYW5pbWFsX2lkKSAlPiUNCiAgICBwdWxsKG1lYW4pKQ0KYGBgDQoNCmBgYHtyIGNhbGN1bGF0aW5nIEFQIGNvdW50LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KQVBDb3VudCA8LSBmdW5jdGlvbihhbmltYWwpIHsNCiAgdG1wX2FwIDwtIFJFQ09SRElOR1MgJT4lDQogICAgZHBseXI6OmZpbHRlcihzaWduYWxfdHlwZSA9PSAiQVAiLCBhbmltYWxfaWQgPT0gYW5pbWFsKSAlPiUNCiAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgIHB1bGwoKQ0KDQogIHN0aW1fdHJhaW5zIDwtIFJFQ09SRElOR1MgJT4lDQogICAgZHBseXI6OmZpbHRlcihzaWduYWxfdHlwZSA9PSAic3RpbSIpICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoDQogICAgICBsYWdfc2ZjID0gbGFnKHN0aW1fZnJlcSksDQogICAgICB0bXBfdmFyID0gaWZlbHNlKGxhZ19zZmMgPT0gc3RpbV9mcmVxICYgIWlzLm5hKGxhZ19zZmMpLCAwLCAxKSwNCiAgICAgIGN1bV90bXBfdmFyID0gY3Vtc3VtKHRtcF92YXIpDQogICAgKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkLCBzdGltX2ZyZXEsIGN1bV90bXBfdmFyKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKHRyYWluX251bWJlciA9IGdyb3VwX2luZGljZXMoKSkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIHNlbGVjdCgtbGFnX3NmYywgLXRtcF92YXIsIC1jdW1fdG1wX3ZhcikgJT4lDQogICAgZHBseXI6OmZpbHRlcihhbmltYWxfaWQgPT0gYW5pbWFsKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9mcmVxX2NhdGVnLCB0cmFpbl9udW1iZXIsIHN0aW1fbnVtYmVyKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKA0KICAgICAgTm9fQVBzID0gbGVuZ3RoKHRtcF9hcFt0bXBfYXAgPiBzaWduYWxfdGltZSAmIHRtcF9hcCA8IHNpZ25hbF90aW1lICsgMC4wNV0pLA0KICAgICAgQVBfdGltZXMgPSBwYXN0ZSh0bXBfYXBbdG1wX2FwID4gc2lnbmFsX3RpbWUgJiB0bXBfYXAgPCBzaWduYWxfdGltZSArIDAuMDVdLCBjb2xsYXBzZSA9ICIsIiksDQogICAgICByYW5nZV9sb3dlciA9IHNpZ25hbF90aW1lLA0KICAgICAgcmFuZ2VfdXBwZXIgPSBzaWduYWxfdGltZSArIDAuMDUNCiAgICApICU+JQ0KICAgIGFkZF9jb2x1bW4oYW5pbWFsX2lkID0gYW5pbWFsLCAuYmVmb3JlID0gMSkgJT4lDQogICAgdW5ncm91cCgpDQogIHJldHVybihzdGltX3RyYWlucykNCn0NCg0KQVBDIDwtIGxhcHBseShSRUNPUkRJTkdTJGFuaW1hbF9pZCAlPiUgdW5pcXVlKCksIEFQQ291bnQpICU+JSBiaW5kX3Jvd3MoKQ0KYGBgDQoNCg0KKiBMaXN0IG9mIHRpYmJsZXMgdXNlZCB0byBzdG9yZSBkYXRhOg0KICArIFJFQ09SRElOR1MgdGliYmxlOiBzdG9yZXMgQVAgYW5kIHN0aW0gdGltZSBzdGFtcHMsIG51bWJlciBvZiBzdGltdWxpIGluIGVhY2ggdHJhaW4sIHN0aW11bHVzIGZyZXF1ZW5jeSBjYXRlZ29yaWVzIChlZy4gOCAxMCBhbmQgMTIgSHogYmVsb25nIHRvIDEwIEh6IGNhdGVnb3J5KQ0KICArIFNUSU1fUkVTVUxUUzogc3RvcmVzIHRoZSBkYXRhIGZvciBQU1RIcyAoQ0FSRUZVTCBXSVRIIFRISVMhISBJdCdzIGdlbmVyYXRlZCBieSB0aGUgIkNyZWF0ZVBTVEhUaWJibGUiIGZ1bmN0aW9uIGJ1dCB0aGUgZnJlcXVlbmNpZXMgaGF2ZSB0byBiZSBjaGFuZ2VkIG1hbnVhbGx5LCBhbmQgaXQgY2FuIGNyZWF0ZSBkdXBsaWNhdGVzISBJIGhhdmUgdG8gd29yayBvbiB0aGF0ISBJZiBzb21ldGhpbmcgZG9lc24ndCBsb29rIHJpZ2h0IG9uIFBTVEhzIG9yIHJlc3BvbnNlIHByb2JhYmlsaXR5IHBsb3RzLCBjaGVjayB0aGlzIG9uZSBmaXJzdCkNCiAgKyBoaXN0X3N0YXRzOiBzdG9yZXMgUFNUSCBzdGF0aXN0aWNzIGNhbGN1bGF0ZWQgZnJvbSBnZ3Bsb3QgDQogICsgUkVTUF9QUk9COiByZXNwb25zZSBwcm9iYWJpbGl0eSBhbmQgbGF0ZW5jeSBkYXRhIGNhbGN1bGF0ZWQgZnJvbSBzdGltIHJlc3VsdHMgYW5kIHJlY29yZGluZ3MNCiAgKyBBUEM6IG51bWJlciBvZiBBUHMgYWZ0ZXIgZWFjaCBzdGltdWx1cyBpbiBhIDUwIG1zIHdpbmRvdw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpkYXRhdGFibGUoUkVDT1JESU5HUywNCiAgY2FwdGlvbiA9ICJSRUNPUkRJTkdTIHRpYmJsZSIsDQogIHJvd25hbWVzID0gVFJVRSwNCiAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYID0gVCwgc2Nyb2xsWSA9ICI1MDBweCIsIGRvbSA9ICJ0IikNCikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpkYXRhdGFibGUoU1RJTV9SRVNVTFRTLA0KICBjYXB0aW9uID0gIlNUSU1fUkVTVUxUUyB0aWJibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKGhpc3Rfc3RhdHMsDQogIGNhcHRpb24gPSAiUFNUSCBzdGF0aXN0aWNzIChoaXN0X3N0YXRzIHRpYmJsZSkiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGF0YWJsZShSRVNQX1BST0IsDQogIGNhcHRpb24gPSAiUmVzcG9uc2UgcHJvYmFiaWxpdGllcyIsDQogIHJvd25hbWVzID0gVFJVRSwNCiAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYID0gVCwgc2Nyb2xsWSA9ICI1MDBweCIsIGRvbSA9ICJ0IikNCikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0YXRhYmxlKEFQQywNCiAgY2FwdGlvbiA9ICJOdW1iZXIgb2YgQVBzIGZvbG93aW5nIGVhY2ggc3RpbXVsdXMiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KDQojIyBQbG90dGluZw0KDQojIyMgRGlzdHJpYnV0aW9uIG9mIGZyaXN0IEFQcyBhZnRlciBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJnZW9tX2ZsYXRfdmlvbGluLlIiKSkNCiMgUFNUSF9yYW5nZSA8LSBjKDAsIDAuMDUpDQpnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXQ0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeSA9IGZpcnN0X2FwX3JlbHRpbWVzLCB4ID0gYW5pbWFsX2lkKQ0KKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGdnaGFsdmVzOjpnZW9tX2hhbGZfdmlvbGluKHNpZGUgPSAiciIsIHRyaW0gPSBULCBzY2FsZSA9ICJ3aWR0aCIpICsNCiAgIyBnZW9tX2RvdHBsb3QoYmluYXhpcyA9ICJ5IiwNCiAgIyAgICAgICAgICAgICAgZG90c2l6ZSA9IDQsDQogICMgICAgICAgICAgICAgIHN0YWNrZGlyID0gImRvd24iLA0KICAjICAgICAgICAgICAgICBiaW53aWR0aCA9IDAuMDAwMixtZXRob2QgPSAiaGlzdG9kb3QiLGJpbnBvc2l0aW9ucyA9ICJhbGwiLA0KICAjICAgICAgICAgICAgICApICsNCiAgIyBzZWU6Omdlb21fdmlvbGluZG90KGJpbndpZHRoID0gMC4wMDAxLHNpemVfZG90cyA9IDYsKSArDQogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDApLCBzaGFwZSA9ICJ8IikgKw0KICAjIGdlb21fYm94cGxvdCh3aWR0aCA9IC4xLCBvdXRsaWVyLmNvbG91ciA9IE5BLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICBmYWNldF93cmFwKH5mcmVxKQ0KYGBgDQoNCiMjIyBQU1RIIEAgMSBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBtYWluIHBsb3QNCg0KIyMjIHNldCBQU1RIIHJhbmdlOiBzZWUgZWFybGllciAoY2FsY3VsYXRpbmcgaGlzdCBzdGF0cyBjaHVuaykNCg0KIyMjIHNlbGVjdCBmcmVxdWVuY3kgdG8gcGxvdCAoMSwgOCwgMTgpDQpmcmVxX3RvX3Bsb3QgPC0gMSAlPiUgYXMuY2hhcmFjdGVyKCkNCg0KZ3BfaGlzdCA8LSBnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXSwNCiAgICAgIGZyZXEgPT0gZnJlcV90b19wbG90DQogICAgICAjIGFuaW1hbF9pZCA9PSAiR0lJXzIxIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KKSArDQogIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgNCiAgICAjYWVzKGZpbGwgPSBhbmltYWxfaWQpLCANCiAgICBiaW53aWR0aCA9IDAuMDAxKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgIHBhbGV0dGUgPSAiU2V0MyIsDQogICAgbmFtZSA9ICJBbmltYWwiDQogICAgIyBndWlkZSA9IEZBTFNFDQogICkgKw0KICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgeGxhYigiVGltZSAocykiKSArDQogIHlsYWIoIkNvdW50IikNCg0KDQoNCiMjIyBsaW5lcw0KZ3BfaGlzdCArDQogICMjIyBtZWRpYW4NCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IG1lZGlhbiwNCiAgICAgIHhlbmQgPSBtZWRpYW4sDQogICAgICB5ID0geV9tYXggKyA3LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTgNCiAgICApLA0KICAgIHNpemUgPSAxDQogICkgKw0KDQogICMjIyBkYXRhIHJhbmdlDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBxdWFudGlsZTI1IC0gMS41ICogSVFSLA0KICAgICAgeGVuZCA9IHF1YW50aWxlMjUsDQogICAgICB5ID0geV9tYXggKyAxMi41LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTIuNQ0KICAgICkNCiAgKSArDQoNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBxdWFudGlsZTc1LCB4ZW5kID0gcXVhbnRpbGU3NSArIDEuNSAqIElRUiwgeSA9IHlfbWF4ICsgMTIuNSwgeWVuZCA9IHlfbWF4ICsgMTIuNSkNCiAgKSArDQoNCiAgIyMjIElRUiAoYm94KQ0KICBnZW9tX3JlY3QoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeG1pbiA9IHF1YW50aWxlMjUsIHhtYXggPSBxdWFudGlsZTc1LCB5bWluID0geV9tYXggKyA3LCB5bWF4ID0geV9tYXggKyAxOCksDQogICAgY29sb3IgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAsDQogICAgaW5oZXJpdC5hZXMgPSBGDQogICkgKw0KDQogICMjIyBtZWFuDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1lYW4sIHkgPSB5X21heCArIDQpLCBzaXplID0gMg0KICApICsNCg0KICAjIyMgcGVhaw0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBwZWFrLCB5ID0geV9tYXggKyA0KSwNCiAgICBzaGFwZSA9IDI1LA0KICAgIHNpemUgPSAyLA0KICAgIGZpbGwgPSAicmVkIg0KICApDQpgYGANCg0KIyMjIFBTVEggQCAxMCBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBtYWluIHBsb3QNCg0KIyMjIHNldCBQU1RIIHJhbmdlOiBzZWUgZWFybGllciAoY2FsY3VsYXRpbmcgaGlzdCBzdGF0cyBjaHVuaykNCg0KIyMjIHNlbGVjdCBmcmVxdWVuY3kgdG8gcGxvdCAoMSwgOCwgMTgpDQpmcmVxX3RvX3Bsb3QgPC0gOCAlPiUgYXMuY2hhcmFjdGVyKCkNCg0KZ3BfaGlzdCA8LSBnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXSwNCiAgICAgIGZyZXEgPT0gZnJlcV90b19wbG90DQogICAgICAjIGFuaW1hbF9pZCA9PSAiR0lJXzIxIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KKSArDQogIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgNCiAgICAjYWVzKGZpbGwgPSBhbmltYWxfaWQpLA0KICAgIGJpbndpZHRoID0gMC4wMDEpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICBuYW1lID0gIkFuaW1hbCINCiAgICAjIGd1aWRlID0gRkFMU0UNCiAgKSArDQogIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICB4bGFiKCJUaW1lIChzKSIpICsNCiAgeWxhYigiQ291bnQiKQ0KDQoNCg0KIyMjIGxpbmVzDQpncF9oaXN0ICsNCiAgIyMjIG1lZGlhbg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gbWVkaWFuLA0KICAgICAgeGVuZCA9IG1lZGlhbiwNCiAgICAgIHkgPSB5X21heCArIDcsDQogICAgICB5ZW5kID0geV9tYXggKyAxOA0KICAgICksDQogICAgc2l6ZSA9IDENCiAgKSArDQoNCiAgIyMjIGRhdGEgcmFuZ2UNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IHF1YW50aWxlMjUgLSAxLjUgKiBJUVIsDQogICAgICB4ZW5kID0gcXVhbnRpbGUyNSwNCiAgICAgIHkgPSB5X21heCArIDEyLjUsDQogICAgICB5ZW5kID0geV9tYXggKyAxMi41DQogICAgKQ0KICApICsNCg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHF1YW50aWxlNzUsIHhlbmQgPSBxdWFudGlsZTc1ICsgMS41ICogSVFSLCB5ID0geV9tYXggKyAxMi41LCB5ZW5kID0geV9tYXggKyAxMi41KQ0KICApICsNCg0KICAjIyMgSVFSIChib3gpDQogIGdlb21fcmVjdCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4bWluID0gcXVhbnRpbGUyNSwgeG1heCA9IHF1YW50aWxlNzUsIHltaW4gPSB5X21heCArIDcsIHltYXggPSB5X21heCArIDE4KSwNCiAgICBjb2xvciA9ICJyZWQiLA0KICAgIGFscGhhID0gMCwNCiAgICBpbmhlcml0LmFlcyA9IEYNCiAgKSArDQoNCiAgIyMjIG1lYW4NCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbiwgeSA9IHlfbWF4ICsgNCksIHNpemUgPSAyDQogICkgKw0KDQogICMjIyBwZWFrDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBlYWssIHkgPSB5X21heCArIDQpLA0KICAgIHNoYXBlID0gMjUsDQogICAgc2l6ZSA9IDIsDQogICAgZmlsbCA9ICJyZWQiDQogICkNCmBgYA0KDQojIyMgUFNUSCBAIDIwIEh6IGNvcnRpY2FsIGFjdGl2YXRpb24NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgbWFpbiBwbG90DQoNCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDE4ICU+JSBhcy5jaGFyYWN0ZXIoKQ0KDQpncF9oaXN0IDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSBmcmVxX3RvX3Bsb3QNCiAgICAgICMgYW5pbWFsX2lkID09ICJHSUlfMjEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQopICsNCiAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogIGdlb21faGlzdG9ncmFtKA0KICAgICNhZXMoZmlsbCA9IGFuaW1hbF9pZCksIA0KICAgIGJpbndpZHRoID0gMC4wMDEpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICBuYW1lID0gIkFuaW1hbCINCiAgICAjIGd1aWRlID0gRkFMU0UNCiAgKSArDQogIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICB4bGFiKCJUaW1lIChzKSIpICsNCiAgeWxhYigiQ291bnQiKQ0KDQoNCg0KIyMjIGxpbmVzDQpncF9oaXN0ICsNCiAgIyMjIG1lZGlhbg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gbWVkaWFuLA0KICAgICAgeGVuZCA9IG1lZGlhbiwNCiAgICAgIHkgPSB5X21heCArIDcsDQogICAgICB5ZW5kID0geV9tYXggKyAxOA0KICAgICksDQogICAgc2l6ZSA9IDENCiAgKSArDQoNCiAgIyMjIGRhdGEgcmFuZ2UNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IHF1YW50aWxlMjUgLSAxLjUgKiBJUVIsDQogICAgICB4ZW5kID0gcXVhbnRpbGUyNSwNCiAgICAgIHkgPSB5X21heCArIDEyLjUsDQogICAgICB5ZW5kID0geV9tYXggKyAxMi41DQogICAgKQ0KICApICsNCg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHF1YW50aWxlNzUsIHhlbmQgPSBxdWFudGlsZTc1ICsgMS41ICogSVFSLCB5ID0geV9tYXggKyAxMi41LCB5ZW5kID0geV9tYXggKyAxMi41KQ0KICApICsNCg0KICAjIyMgSVFSIChib3gpDQogIGdlb21fcmVjdCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4bWluID0gcXVhbnRpbGUyNSwgeG1heCA9IHF1YW50aWxlNzUsIHltaW4gPSB5X21heCArIDcsIHltYXggPSB5X21heCArIDE4KSwNCiAgICBjb2xvciA9ICJyZWQiLA0KICAgIGFscGhhID0gMCwNCiAgICBpbmhlcml0LmFlcyA9IEYNCiAgKSArDQoNCiAgIyMjIG1lYW4NCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbiwgeSA9IHlfbWF4ICsgNCksIHNpemUgPSAyDQogICkgKw0KDQogICMjIyBwZWFrDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBlYWssIHkgPSB5X21heCArIDQpLA0KICAgIHNoYXBlID0gMjUsDQogICAgc2l6ZSA9IDIsDQogICAgZmlsbCA9ICJyZWQiDQogICkNCmBgYA0KDQoNCiMjIyBSZXNwb25zZSBwcm9iYWJpbGl0eSBhbmQgbGF0ZW5jeQ0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBSRVNQX1BST0IsIyAlPiUNCiAgICAjZHBseXI6OmZpbHRlcihhbmltYWxfaWQgIT0gIkdJSV8yMCIpLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBhcy5mYWN0b3Ioc3RpbV9mcmVxKSwNCiAgICB5ID0gcmVzcF9wcm9iX3JhbmdlDQogICkNCikgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLCB3aWR0aCA9IDAuMiwgbHdkID0gMSwgZmF0dGVuID0gMS4yKSArDQogIGdlb21fcG9pbnQoDQogICAgYWVzKA0KICAgICAgI2ZpbGwgPSBhbmltYWxfaWQNCiAgICAgICksDQogICAgZmlsbCA9ICJncmF5IiwNCiAgICBjb2xvciA9ICJibGFjayIsDQogICAgc2l6ZSA9IDMsDQogICAgc2hhcGUgPSAyMSwNCiAgICAjcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4xKQ0KICApICsNCiAgIyBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYW5pbWFsX2lkKSkgKw0KICB4bGFiKCJTdGltdWx1cyBmcmVxdWVuY3kiKSArDQogIHlsYWIoIlJlc3BvbnNlIHByb2JhYmlsaXR5IikgKw0KICBnZW9tX3NpZ25pZigNCiAgICBjb21wYXJpc29ucyA9IGxpc3QoYygiMSIsICIxMCIpKSwNCiAgICBtYXBfc2lnbmlmX2xldmVsID0gVFJVRSwNCiAgICB0ZXN0ID0gIm1vb2QudGVzdCIsDQogICAgY29sb3IgPSAiZ3JheSINCiAgKSArDQogIGdlb21fc2lnbmlmKA0KICAgIGNvbXBhcmlzb25zID0gbGlzdChjKCIxMCIsICIyMCIpKSwNCiAgICBtYXBfc2lnbmlmX2xldmVsID0gVFJVRSwNCiAgICB0ZXN0ID0gIm1vb2QudGVzdCIsDQogICAgbWFyZ2luX3RvcCA9IC4xLA0KICAgIGNvbG9yID0gImdyYXkiDQogICAgICANCiAgKSArDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBhZXMobGFiZWwgPSBhbmltYWxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0uNSkNCiAgDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBSRVNQX1BST0IgJT4lDQogICAgZ2F0aGVyKA0KICAgICAga2V5ID0gImxhdGVuY3lfdHlwZSIsDQogICAgICB2YWx1ZSA9ICJsYXRlbmN5X3ZhbHVlIiwNCiAgICAgIHBlYWtfbGF0ZW5jeSwNCiAgICAgIG1lYW5fbGF0ZW5jeQ0KICAgICkgJT4lDQogICAgZHBseXI6OmZpbHRlcihhbmltYWxfaWQgIT0gIkdJSV8yMCIpLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBhcy5mYWN0b3Ioc3RpbV9mcmVxKSwNCiAgICB5ID0gbGF0ZW5jeV92YWx1ZSAqIDEwMDANCiAgKQ0KKSArDQogICMjIyBkYXRhIHZpc3VhbGl6YXRpb24gbGF5ZXJzDQogIGdlb21fcG9pbnQoDQogICAgYWVzKGZpbGwgPSBsYXRlbmN5X3R5cGUpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC40KSwNCiAgICBzaXplID0gMywNCiAgICBjb2xvciA9ICJibGFjayIsDQogICAgc2hhcGUgPSAyMQ0KICApICsNCiAgZ2VvbV9ib3hwbG90KA0KICAgIGFlcyhjb2xvciA9IGxhdGVuY3lfdHlwZSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjQpLA0KICAgIHdpZHRoID0gMC4zLA0KICAgIGFscGhhID0gMCwNCiAgICBsd2QgPSAxLA0KICAgIGZhdHRlbiA9IDEuMg0KICApICsNCiAgeWxpbSgwLCAyNSkgKw0KICB4bGFiKCJTdGltdWx1cyBmcmVxdWVuY3kiKSArDQogIHlsYWIoIlBlYWsgbGF0ZW5jeSIpICsNCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoDQogICAgbmFtZSA9ICJMYXRlbmN5IiwNCiAgICBicmVha3MgPSBjKCJtZWFuX2xhdGVuY3kiLCAicGVha19sYXRlbmN5IiksDQogICAgbGFiZWxzID0gYygiTWVhbiIsICJQZWFrIiksDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChjb2xvciA9IGMocmVwKE5BLCAyKSkpKQ0KICApICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZSgNCiAgICBuYW1lID0gIkxhdGVuY3kiLA0KICAgIGJyZWFrcyA9IGMoIm1lYW5fbGF0ZW5jeSIsICJwZWFrX2xhdGVuY3kiKSwNCiAgICBsYWJlbHMgPSBjKCJNZWFuIiwgIlBlYWsiKQ0KICApIA0KYGBgDQoNCg0KIyMjIE51bWJlciBvZiBBUHMgYWZ0ZXIgZWFjaCBzdGltdWx1cyBpbiBzdGltdWx1cyB0cmFpbnMgKDUwIG1zIHdpbmRvdykNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBBUEMgJT4lDQogICAgZHBseXI6OmZpbHRlcihzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIiksIHN0aW1fbnVtYmVyIDwgMTEpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UoTm9fQVBzID0gc3VtKE5vX0FQcykpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9mcmVxX2NhdGVnLCBzdGltX251bWJlcikgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICAgIE5vX0FQX21lYW4gPSBtZWFuKE5vX0FQcyksDQogICAgICBOb19BUF9zZCA9IHNkKE5vX0FQcyksDQogICAgICBTRU0gPSBzZChOb19BUHMpIC8gc3FydChsZW5ndGgoTm9fQVBzKSkNCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBzdGltX251bWJlciwNCiAgICB5ID0gTm9fQVBfbWVhbiwNCiAgICBjb2xvdXIgPSBhcy5mYWN0b3Ioc3RpbV9mcmVxX2NhdGVnKSwNCiAgICBncm91cCA9IGFzLmZhY3RvcihzdGltX2ZyZXFfY2F0ZWcpDQogICkNCikgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoKSArDQogIHhsYWIoIk5vLiBzdGltdWx1cyBpbiB0cmFpbiIpICsNCiAgeWxhYigiTWVhbiBuby4gQVBzIGFjY3Jvc3MgYW5pbWFscyIpICsNCiAgbGFicyhjb2xvciA9ICJGcmVxdWVuY3kiKSArDQogIHlsaW0oMCwgMTgpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBhcy5jaGFyYWN0ZXIoYygxOjEwKSkpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBBUEMgJT4lDQogICAgZHBseXI6OmZpbHRlcihzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIiksIHN0aW1fbnVtYmVyIDwgMTEpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UoTm9fQVBzID0gc3VtKE5vX0FQcykpLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBzdGltX251bWJlciwNCiAgICB5ID0gTm9fQVBzLA0KICAgIGNvbG9yID0gYXMuZmFjdG9yKGFuaW1hbF9pZCksDQogICAgbGluZXR5cGUgPSBhcy5mYWN0b3IoYW5pbWFsX2lkKQ0KICApDQopICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoMToxMCksIGJyZWFrcyA9IGMoMToxMCkpICsNCiAgZ2VvbV9sYWJlbF9yZXBlbCgNCiAgICBkYXRhID0gLiAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3RpbV9udW1iZXIgPT0gMTApLA0KICAgIGFlcyhsYWJlbCA9IGFuaW1hbF9pZCksDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGhqdXN0ID0gLTIsDQogICAgYWxwaGEgPSAuNw0KICApICsNCiAgZXhwYW5kX2xpbWl0cyh4ID0gMTIpICsNCg0KICAjIHhsaW0oMSwxMCkgKw0KICBmYWNldF93cmFwKH5zdGltX2ZyZXFfY2F0ZWcpICsNCiAgbGFicyhsaW5ldHlwZSA9ICJBbmltYWxzIiwgY29sb3IgPSAiQW5pbWFscyIpICsNCiAgeGxhYigiTm8uIHN0aW11bHVzIGluIHRyYWluIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgQVBzIikNCmBgYA0KDQoNCg0KIyBTcG9udGFuZW91cyBkZXN5bmNocm9uaXphdGlvbiBvZiB0aGUgRkMgc2xvdyBvc2NpbGxhdGlvbiANCg0KIyMgTG9hZGluZyBkYXRhIA0KDQpMb2FkaW5nIG1hdCBmaWxlcyB0byAqZmlsZV9saXN0KiBvYmplY3QNCg0KYGBge3IsICBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmZpbGVfbGlzdCA8LSBsaXN0LmZpbGVzKA0KICBwYXRoID0gImRhdGEiLA0KICBwYXR0ZXJuID0gIioubWF0IiwgZnVsbC5uYW1lcyA9IEYsIHJlY3Vyc2l2ZSA9IEYNCikNCg0KYGBgDQoNCkNvbnRlbnQgb2YgbWF0IGZpbGVzOg0KDQoqIEFQIGNoYW5uZWwNCiAgKyAqKnRpdGxlOioqIGNoYW5uZWwgbmFtZQ0KICArICoqY29tbWVudDoqKiBub3RlcyBhYm91dCB0aGUgY2hhbm5lbA0KICArICoqcmVzb2x1dGlvbjoqKiAyLjVlLTA2DQogICsgKippbnRlcnZhbDoqKiB0aW1lIGJldHdlZW4gdHdvIGRhdGEgcG9pbnRzIGluIHNlYyAoNWUtMDUpDQogICsgKipzY2FsZToqKiBzY2FsaW5nIGZhY3RvciAoeSBzY2FsZSksIHJlYWwgPSAoZGF0YSAqIHNjYWxlKSArIG9mZnNldA0KICArICoqb2Zmc2V0OioqIHNjYWxlIG9mZnNldA0KICArICoqdW5pdHM6KiogdW5pdCBvZiB0aGUgY2hhbm5lbCAodm9sdCkNCiAgKyAqKmxlbmd0aDoqKiBudW1iZXIgb2YgQVBzDQogICsgKippdGVtczoqKiBOby4gcG9pbnRzIGVhc2NoIEFQIGlzIHJlcHJlc2VudGVkIGJ5DQogICsgKip0cmlnZ2VyOioqDQogICsgKip0cmFjZXM6KioNCiAgKyAqKnRpbWVzOioqIHRpbWVzIG9mIHRoZSBBUHMgKGZpcnN0IGRhdGEgcG9pbnQgb2YgdGhlIHdhdmVmb3JtKQ0KICArICoqY29kZXM6KiogbWFya2VyIGNvZGVzIG9mIHRoZSBBUHMNCiAgKyAqKnZhbHVlczoqKiBtYXRyaXggY29udGFpbmluZyB0aGUgd2F2ZWZvcm1zIG9mIHRoZSBBUHMgKGRlc2NyaWJlZCBieSBhIGdpdmVuIE5vLiBwb2ludHMpDQogDQoqIEVFRyBjaGFubmVsDQogICsgKip0aXRsZToqKiBjaGFubmVsIG5hbWUNCiAgKyAqKmNvbW1lbnQ6KioNCiAgKyAqKmludGVydmFsOioqDQogICsgKipzY2FsZToqKiBzY2FsaW5nIGZhY3RvciAoeSBzY2FsZSksIHJlYWwgPSAoZGF0YSAqIHNjYWxlKSArIG9mZnNldA0KICArICoqb2Zmc2V0OioqIHNjYWxlIG9mZnNldA0KICArICoqdW5pdHM6KioNCiAgKyAqKnN0YXJ0OioqDQogICsgKipsZW5ndGg6KioNCiAgKyAqKnZhbHVlczoqKg0KDQpgYGB7cn0NCmZpbGVfdG9fbG9hZCA8LSBmaWxlX2xpc3RbWzFdXQ0KZmlsZW5hbWUgPC0gYXMuY2hhcmFjdGVyKHN1YnN0cmluZyhmaWxlX3RvX2xvYWQsIDEsIG5jaGFyKGZpbGVfdG9fbG9hZCkgLSA0KSkNCnJhdy5yZWMgPC0gcmVhZE1hdChmaWxlLnBhdGgoImRhdGEiLCBmaWxlX3RvX2xvYWQpKQ0KDQojIyMgdGFrZXMgdGhlIGZpcnN0IEFQIChmaXJzdCByb3cpIGFuZCB0ZWxscyB0aGUgaW5kZXggb2YgcG9pbnQgd2l0aCB0aGUgbWF4IHZhbHVlDQpwb2ludHNfdG9fcGVhayA8LSB3aGljaChyYXcucmVjJGFwWywgLCAxXSR2YWx1ZXNbMSwgXSA9PQ0KICBtYXgocmF3LnJlYyRhcFssICwgMV0kdmFsdWVzWzEsIF0pKSAlPiUNCiAgYXMubnVtZXJpYygpDQoNCiMjIyB0aW1lIG9mIHRoZSBwZWFrIG9mIHRoZSBBUHMgYWZ0ZXIgaXRzIGZpcnN0IHBvaW50DQpyYXcucmVjJGFwWywgLCAxXSRpbnRlcnZhbCAqIHBvaW50c190b19wZWFrDQoNCmFwIDwtIHJhdy5yZWMkYXBbLCAsIDFdJHRpbWVzICU+JSBhcy5kb3VibGUoKQ0KYXBfcGVha3MgPC0gdGliYmxlKHBlYWtfdGltZXMgPSAoYXAgKyBjKHJhdy5yZWMkYXBbLCAsIDFdJGludGVydmFsICogcG9pbnRzX3RvX3BlYWspKSkNCmBgYA0KDQoNCi0tLS0tLS0gaW5zZXJ0IGNvZGUgaGVyZSAtLS0tLS0tLQ0KIA0KKHNwb250X2Rlc3luY2hyb25fYW5hbHlzaXMuUiksIDcgcmVjb3JkaW5ncw0KDQojIFRlcm1pbmFscw0KDQojIyBMb2FkaW5nIGRhdGENCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZmlsZV9wYXRoIDwtIGZpbGUucGF0aCgNCiAgImRhdGEiLA0KICAiRW1pX3Rlcm1pbmFscyIsDQogICJ0ZXJtaW5hbF9tZWFzdXJlcy5jc3YiDQopDQpURVJNSU5BTFMgPC0gcmVhZC50YWJsZShmaWxlID0gZmlsZV9wYXRoLCBzZXAgPSAiOyIsIGhlYWRlciA9IFQsIG5hLnN0cmluZyA9ICJuYSIpDQpoZWFkKFRFUk1JTkFMUykNCmBgYA0KDQojIyBCb3V0b24gYXJlYSBvbiBkaWZmZXJlbnQgZGVuZHJpdGljIGRvbWFpbnMNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBURVJNSU5BTFMsIG1hcHBpbmcgPSBhZXMoeCA9IHBvc3Rpb24sIHkgPSBiX2FyZWEpKSArDQogIGdlb21faGFsZl92aW9saW4oDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gLS4xNSksDQogICAgdHJpbSA9IEYsDQogICAgc2lkZSA9ICJsIiwNCiAgICBzY2FsZSA9ICJhcmVhIiwNCiAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KSwNCiAgICBhZXMoZmlsbCA9IHBvc3Rpb24pDQogICkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpKQ0KYGBgDQoNCiMjIEFyZWEgb2YgYm91dG9ucyB3aXRoICptMiogYW5kICp1bmtub3duKiBvcmlnaW4NCg0KYGBge3IgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gVEVSTUlOQUxTLA0KICBtYXBwaW5nID0gYWVzKHggPSBvcmlnaW4sIHkgPSBiX2FyZWEpDQopICsNCiAgZ2VvbV9oYWxmX3Zpb2xpbigNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAtLjE1KSwNCiAgICB0cmltID0gRiwNCiAgICBzaWRlID0gImwiLA0KICAgIHNjYWxlID0gImNvdW50IiwNCiAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KQ0KICAgICMgZmlsbCA9IGFscGhhKDAuMSksDQogICAgIyBhZXMoY29sID0gcG9zdGlvbikNCiAgKSArDQogIGdlb21faml0dGVyKA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMSksDQogICAgYWVzKGNvbCA9IHBvc3Rpb24pDQogICkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgeCA9IDAuNywNCiAgICB5ID0gMSwNCiAgICBsYWJlbCA9IHBhc3RlKA0KICAgICAgIm4gPSAiLA0KICAgICAgVEVSTUlOQUxTICU+JQ0KICAgICAgICBkcGx5cjo6Z3JvdXBfYnkob3JpZ2luKSAlPiUNCiAgICAgICAgZHBseXI6OnN1bW1hcmlzZShuID0gbGVuZ3RoKGJfYXJlYSkpICU+JQ0KICAgICAgICBkcGx5cjo6ZmlsdGVyKG9yaWdpbiA9PSAibTIiKSAlPiUNCiAgICAgICAgc2VsZWN0KG4pICU+JQ0KICAgICAgICBhcy5jaGFyYWN0ZXIoKQ0KICAgICkNCiAgKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICB4ID0gMS42LA0KICAgIHkgPSAxLA0KICAgIGxhYmVsID0gcGFzdGUoDQogICAgICAibiA9ICIsDQogICAgICBURVJNSU5BTFMgJT4lDQogICAgICAgIGRwbHlyOjpncm91cF9ieShvcmlnaW4pICU+JQ0KICAgICAgICBkcGx5cjo6c3VtbWFyaXNlKG4gPSBsZW5ndGgoYl9hcmVhKSkgJT4lDQogICAgICAgIGRwbHlyOjpmaWx0ZXIob3JpZ2luID09ICJ1bmtub3duIikgJT4lDQogICAgICAgIHNlbGVjdChuKSAlPiUNCiAgICAgICAgYXMuY2hhcmFjdGVyKCkNCiAgICApDQogICkNCmBgYA0KDQoNCjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPg0KDQojIE1ldGhvZHMNCg0KDQoNCg0KKipSKioNClIgQ29yZSBUZWFtICgyMDIxKS4gUjogQSBsYW5ndWFnZSBhbmQgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZy4gUiBGb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmcsIFZpZW5uYSwgQXVzdHJpYS4gVVJMIGh0dHBzOi8vd3d3LlItcHJvamVjdC5vcmcvLg0KDQoqKmdncGxvdDIqKg0KSC4gV2lja2hhbS4gZ2dwbG90MjogRWxlZ2FudCBHcmFwaGljcyBmb3IgRGF0YSBBbmFseXNpcy4gU3ByaW5nZXItVmVybGFnIE5ldyBZb3JrLCAyMDE2Lg0KDQoqKnRpZHl2ZXJzZSoqDQpXaWNraGFtIGV0IGFsLiwgKDIwMTkpLiBXZWxjb21lIHRvIHRoZSB0aWR5dmVyc2UuIEpvdXJuYWwgb2YgT3BlbiBTb3VyY2UgU29mdHdhcmUsIDQoNDMpLCAxNjg2LCBodHRwczovL2RvaS5vcmcvMTAuMjExMDUvam9zcy4wMTY4Ng0KDQoNCg==
=======
LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIsIEVtaWxpYSBCb3N6LCBMYXN6bG8gQWNzYWR5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB0cnVlDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQpzcGFjaW5nOiBzaW5nbGUNCmZvbnRzaXplOiAxMnB0DQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KDQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC1mYW1pbHk6ICJBcmlhbCIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzRkNGU0ZjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgzIHsgLyogSGVhZGVyIDMgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShSLm1hdGxhYikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoc3R5bGVyKQ0KbGlicmFyeShmb3JtYXRSKQ0KDQpsaWJyYXJ5KGJzcGVjKSAjIyMgcG93ZXIgc3BlY3RydW0NCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KGRpcHRlc3QpICMjIyB0byB0ZXN0IGRpc3RyaWJ1dGlvbiB1bmkvbXVsdGltb2RhbGl0eSAoSVNJKQ0KbGlicmFyeShleGFjdFJhbmtUZXN0cykgIyMjIHdpbGNveC50ZXN0IGZvciB0aWVzDQpsaWJyYXJ5KFdhdmVsZXRDb21wKSAjIyMgd2F2ZWxldA0KbGlicmFyeShzaWduYWwpDQoNCmxpYnJhcnkoU1RBUikNCmxpYnJhcnkoc2VlKSAjIGZvciBoYWxmIHZpb2xpbnBsb3QNCmxpYnJhcnkoZ2doYWx2ZXMpICMgZm9yIGhhbGYgdmlvbGlucGxvdA0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IFRSVUUsIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmID0gMzApKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KDQoNCiMgRmlyaW5nIHJhdGUgb2YgSUwgbmV1cm9ucyBkdXJpbmcgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbg0KDQpJbiB0aGVzZSBleHBlcmltZW50cyBnbHljaW5lcmdpYyBmaWJlcnMgd2VyZSBwaG90YWN0aXZhdGVkIHdoaWxlIHRoZSBmaXJpbmcgcmF0ZSBvZiBpbmRpdmlkdWFsIElMIG5ldXJvbnMgd2FzIHJlY29yZGVkLiBTb21lIG9mIHRoZSBJTCBjZWxscyBoYWQgdmVyeSBsb3cgYmFzZWxpbmUgYWN0aXZpdHkuIEluIG9yZGVyIHRvIGluY3JlYXNlIHRoZSBmaXJpbmcgcmF0ZSBvZiB0aGUgSUwgbmV1cm9ucyBhbmQgdG8gZGV0ZWN0IHRoZSBlZmZlY3Qgb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24gYSBzbWFsbCB0YWlsIHBpbmNoIHdhcyBhcHBsaWVkLiBUaGUgZmlyaW5nIHJhdGUgb2YgdGhlIHJlY29yZGVkIElMIGNlbGxzIGRlY3JlYXNlZCBkdXJpbmcgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24uIA0KDQoNCiMjIExvYWRpbmcgZGF0YQ0KDQoNCkxvYWRpbmcgQVAgYW5kIHN0aW11bGkgdGltZXMgZnJvbSAqc3RpbXVsdXMqIGFuZCBmcm9tICpiYXNlbGluZSogZGF0YSB0byAqKklMX3N0aW1fZmlyaW5nKiogYW5kIHRvICoqSUxfYmFzZWxpbmVfZmlyaW5nKiogdGFibGVzOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KSUxfc3RpbV9maXJpbmcgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiQVBfdGltZXMuY3N2IikpLA0KICBzdGltX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJzdGltdWx1cyIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KSUxfc3RpbV9maXJpbmcgJT4lIGhlYWQoKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KSUxfYmFzZWxpbmVfZmlyaW5nIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgIkFQX3RpbWVzLmNzdiIpKSwNCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAiYmFzZWxpbmUiLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyBTdW1tYXJ5IGluZm9ybWF0aW9uIA0KDQpTdW1tYXJ5IGluZm9ybWF0aW9uIG9mIHRoZSAqc3RpbXVsdXMqIGFuZCAgKmJhc2VsaW5lKiByZWNvcmRpbmcgZmlsZXM6DQoNCiogVmFyaWFibGVzOg0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmF3IHJlY29yZGluZyBmaWxlcyAoKk5vX2NoKikNCiAgKyBudW1iZXIgb2YgQVBzICgqTm9fQVBfdW5pdCosICpOb19BUF91bml0MiopDQogICsgbnVtYmVyIG9mIHN0aW11bHVzIHRyYWlucyAoKk5vX1N0aW0qKQ0KICArIExGUCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX2xmcCopDQogICsgdW5pdCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX3VuaXQqKQ0KICArIGxlbmd0aCBvZiB0aGUgcmVjb3JkaW5nICgqcmVjX2xlbmd0aCopDQogICsgbGVuZ3RoIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpOb190cmFpbnMqKQ0KICArIEFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zIGVxdWFsIGluIHRoZSByZWNvcmRpbmcgKCp0cmFpbl9sZW5ndGhfZXF1YWwqKQ0KICArIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKnRyYWluX3N0YXJ0KikNCiAgKyBlbmRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fZW5kKikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSB9DQoNCmluZm9fc3RpbSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgInN0aW11bHVzIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX3N0aW0sDQogIGNhcHRpb24gPSAiU3VtbWFyeSB0YWJsZSBvZiB0aGUgc3RpbXVsdXMgcmVjb3JkaW5nIGZpbGVzIChpbmZvX3N0aW0pIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCjxicj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaW5mb19iYXNlbGluZSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX2Jhc2VsaW5lLA0KICBjYXB0aW9uID0gIlN1bW1hcnkgdGFibGUgb2YgdGhlIGJhc2VsaW5lIHJlY29yZGluZyBmaWxlcyAoaW5mb19iYXNlbGluZSkiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj4NCg0KKipDRUxMX0lORk8qKiB0YWJsZSB0byBzdG9yZSB0aGUgY2VsbCBjYXRlZ29yaWVzLiBJdCB3YXMgY3JlYXRlZCBtYW51YWxseSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3VtbWFyeSBleGNlbCB0YWJsZSAoKkdsaWN5X2p1eHRhLWZtX2V4cF9yZWNvcmRzX2luamVjdGlvbl9zdW0ueGxzKikNCg0KKiBWYXJpYWJsZXMNCiAgKyBjZWxsIGlkZW50aWZpY2F0aW9uICgqY2VsbF9pZCopLiBUbyBmaW5kIHRoZSByZWNvcmRpbmcgZmlsZSB1c2UgdGhlIHN1bW1hcnkgZXhjZWwgdGFibGUNCiAgKyBmaWxlIG5hbWVzICgqZmlsZV9uYW1lKikNCiAgKyBzcG9udGFuZW91c2x5IGFjdGl2ZSBjZWxscyAoKmJsX2FjdGl2aXR5KikNCiAgKyBpbmR1Y2VkIGZpcmluZyAoKnBpbmNoKikNCiAgKyBpbmRpdmlkdWFsbHkgaWRlbnRpZmllZCBuZXVyb25zICgqaWRlbnQqKQ0KICArIGNvbnRyb2wgY2VsbHMgKCpjb250cm9sKikNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIyBDRUxMIElORk8gdG8gc3RvcmUgY2F0ZWdvcmllcyAoc3BvbnRhbmVvdXNseSBhY3RpdmUsIGluZHVjZWQgZmlyaW5nLCBpZGVudGlmaWVkKQ0KQ0VMTF9JTkZPIDwtIGluZm9fYmFzZWxpbmUgJT4lDQogIHNlbGVjdChmaWxlX25hbWUpICU+JQ0KICBhZGRfY29sdW1uKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19iYXNlbGluZSRmaWxlX25hbWUsIDEsIDYpLCAuYmVmb3JlID0gImZpbGVfbmFtZSIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGJsX2FjdGl2aXR5ID0gVCkgJT4lDQogIGRwbHlyOjptdXRhdGUoYmxfYWN0aXZpdHkgPSByZXBsYWNlKA0KICAgIGJsX2FjdGl2aXR5LA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIsDQogICAgRg0KICApKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwaW5jaCA9IFQpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBpbmNoID0gcmVwbGFjZSgNCiAgICBwaW5jaCwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE5IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoaWRlbnQgPSBUKSAlPiUNCiAgZHBseXI6Om11dGF0ZShpZGVudCA9IHJlcGxhY2UoDQogICAgaWRlbnQsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjciLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY29udHJvbCA9IEYpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNvbnRyb2wgPSByZXBsYWNlKA0KICAgIGNvbnRyb2wsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI5IiwNCiAgICBUDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gInVua25vd24iKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDExIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiLA0KICAgICJJTCINCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUocG9zaXRpb24gPSByZXBsYWNlKA0KICAgIHBvc2l0aW9uLA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjIiLA0KICAgICJ0cmFuc2llbnQiDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gcmVwbGFjZSgNCiAgICBwb3NpdGlvbiwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgICJQRiINCiAgKSkNCg0KZGF0YXRhYmxlKENFTExfSU5GTywNCiAgY2FwdGlvbiA9ICJDRUxMX0lORk8gdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQoNCiMgSUxfc3RpbV9maXJpbmckZmlsZV9uYW1lICU+JSB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkNCiMgaW5mb19zdGltJGZpbGVfbmFtZSAlPiUgbGVuZ3RoKCkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIENhbGN1bGF0aW9ucw0KIyMjIEZpcmluZyByYXRlcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMjIyBDQUxDVUxBVElORyAtLS0tLS0tLQ0KDQpJTF9zdGltX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfc3RpbV9maXJpbmcsDQogIGluZm9fc3RpbSAlPiUNCiAgICBzZWxlY3QoDQogICAgICBmaWxlX25hbWUsDQogICAgICByZWNfbGVuZ3RoLA0KICAgICAgdHJhaW5fc3RhcnRzLA0KICAgICAgdHJhaW5fZW5kcywNCiAgICAgIHRyYWluX2xlbmd0aA0KICAgICksDQogIGJ5ID0gImZpbGVfbmFtZSINCikNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW0gc3RhcnQgdGltZXMNCnN0YXJ0X3RpbWVzIDwtIElMX3N0aW1fZmlyaW5nICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZmlsZV9uYW1lKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY2VsbF9pZCA9IHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjpncm91cF9ieShjZWxsX2lkKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSkgJT4lDQogIHB1bGwodHJhaW5fc3RhcnRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbSBlbmQgdGltZXMNCmVuZF90aW1lcyA8LSBJTF9zdGltX2ZpcmluZyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fc3RhcnRzID0gdW5pcXVlKHRyYWluX3N0YXJ0cyksIHRyYWluX2VuZHMgPSB1bmlxdWUodHJhaW5fZW5kcykpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIHB1bGwodHJhaW5fZW5kcykgJT4lDQogIHN0cnNwbGl0KCIsIikgJT4lDQogIHNldF9uYW1lcyhzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBsYXBwbHkoYXMubnVtZXJpYykNCg0KDQpjZWxsX2xpc3QgPC0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpDQpDRUxMX0lORk8kY2VsbF9pZA0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIEFQIGIvZC9hIHN0aW0uIEFyZ3VtZW50czogZGF0YSAoSUxfc3RpbV9maXJpbmcgdGFibGUgd2l0aCByZWNfbGVuZ3RoIGFuZCBzdGltdWx1cyB0cmFpbiBpbmZvcm1hdGlvbikNCkJEQUNhbGN1bGF0b3IgPC0gZnVuY3Rpb24oZGF0YSwgbGlzdCkgew0KICBjZWxsX2xpc3QgPC0gbGlzdA0KDQogIHRyYWluX2xlbmd0aCA8LSBkYXRhICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0KSAlPiUNCiAgICBzZWxlY3QodHJhaW5fbGVuZ3RoKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgYFtbYCgxKQ0KDQoNCg0KICBpZiAoDQogICAgKGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3QodW5pdF9pZCkgJT4lDQogICAgICB1bmlxdWUoKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGxlbmd0aCgpKSA9PSAxDQogICkgew0KICAgICMjIyBJbiBjYXNlIG9mIG9uZSB1bml0IGluIHRoZSBmaWxlOg0KICAgIEFQX3RpbWVzIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpDQoNCiAgICBBUF9udW1iZXJzIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnMpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgIDwgQVBfdGltZXMgJiBBUF90aW1lcyA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgQVBfdGltZXMgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNbQVBfdGltZXMgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQogICAgbWVsdChBUF9udW1iZXJzLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgIGFkZF9jb2x1bW4oY2VsbF9pZCA9IGNlbGxfbGlzdCkgJT4lDQogICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgfSBlbHNlIHsNCiAgICAjIyMgaW4gY2FzZSBvZiBtdWx0aXBsZSB1bml0cyBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lc18xIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAxKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMSA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzEpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMVt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18xW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzEgJiBBUF90aW1lc18xIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18xIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMSA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCiAgICBBUF90aW1lc18yIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAyKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMiA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzIpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18yW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzIgJiBBUF90aW1lc18yIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18yIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCg0KICAgIGlmIChjZWxsX2xpc3QgJT4lIHN1YnN0cig1LCA2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDEpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwwIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSAlPiUgbmNoYXIoKSA9PSAyKSB7DQogICAgICBuZXdfbmFtZSA8LSBwYXN0ZTAoDQogICAgICAgICJjZWxsIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBiaW5kX3Jvd3MoDQogICAgICBtZWx0KEFQX251bWJlcnNfMSwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gY2VsbF9saXN0KSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpLA0KDQogICAgICBtZWx0KEFQX251bWJlcnNfMiwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gbmV3X25hbWUpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgICApDQogIH0gIyBlbHNlDQp9ICMgZm9vDQpgYGANCg0KKipiX2RfYV9NRlIqKjogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBBUHMgLXVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpCREFDYWxjdWxhdG9yKiktIGJlZm9yZSBkdXJpbmcgYW5kIGFmdGVyIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpiX2RfYV9NRlIqKS4gDQoNCmBgYHtyfQ0KYl9kX2FfTUZSIDwtIGxhcHBseShDRUxMX0lORk8kY2VsbF9pZCwgQkRBQ2FsY3VsYXRvciwgZGF0YSA9IElMX3N0aW1fZmlyaW5nKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGRwbHlyOjptdXRhdGUoRlIgPSBOb19BUCAvIHRyYWluX2xlbmd0aCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShzdGltX2NvbmQsIGNlbGxfaWQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKE1GUiA9IG1lYW4oRlIpKQ0KYGBgDQoNCjxicj4NCioqc2RfbWVhbl9pc2kqKjogQ2FsY3VsYXRpbmcgdGhlIGJhc2VsaW5lIE1GUiBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZnJvbSB0aGUgKklMX2Jhc2VsaW5lX2ZpcmluZyogdGFibGUgdXNpbmcgYSBjdXN0b20gbWFkZSBmdW5jdGlvbiAoKlNETWVhbklTSSopLiBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHRoZSAqc2RfbWVhbl9pc2kqIHRhYmxlLg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCklMX2Jhc2VsaW5lX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfYmFzZWxpbmVfZmlyaW5nLA0KICBpbmZvX2Jhc2VsaW5lICU+JQ0KICAgIHNlbGVjdChmaWxlX25hbWUsIHJlY19sZW5ndGgpLA0KICBieSA9ICJmaWxlX25hbWUiDQopICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fY29uZCA9ICJiYXNlbGluZSIpDQoNCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgSVNJIG1lYW4gYW5kIFNEIGR1cmluZyBiYXNlbGluZSBhY3Rpdml0eSBvZiB0aGUgY2VsbHMNClNETWVhbklTSSA8LSBmdW5jdGlvbihmX25hbWUpIHsNCg0KDQogICMgbWVhbl9pc2kgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAjICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgIyAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICMgICBwdWxsKCkgJT4lDQogICMgICBkaWZmKCkgJT4lDQogICMgICBtZWFuKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHNkX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIHNkKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHJldHVybihsaXN0KE1GUiA9IG1lYW5faXNpLA0KICAjICAgICAgICAgICAgIFNERlIgPSBzZF9pc2kpKQ0KDQogIHRtcDIgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgZGlmZigpICU+JQ0KICAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICAgICB0aWJibGUobWVhbl9pc2kgPSAuKQ0KICB0bXAyICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc2RfaXNpID0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBkaWZmKCkgJT4lDQogICAgICBzZCgpICogMTAwMCkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmaWxlX25hbWUgPSBmX25hbWUpDQp9DQoNCnNkX21lYW5faXNpIDwtIGxhcHBseShpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgU0RNZWFuSVNJKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFzLnRpYmJsZSgpDQoNCnNkX21lYW5faXNpIDwtIHNkX21lYW5faXNpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoc2RfbWVhbl9pc2kkZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSID0gMTAwMCAvIG1lYW5faXNpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShTRF9GUiA9IDEwMDAgLyBzZF9pc2kpICU+JQ0KICBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSBNRlIgKyBTRF9GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSX2RlYyA9IE1GUiAtIFNEX0ZSKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSAxMDAwLyhtZWFuX2lzaS1zZF9pc2kpKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9kZWMgPSAxMDAwLyhtZWFuX2lzaStzZF9pc2kpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2NvbmQgPSAiYmFzZWxpbmUiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShNRlJfZGVjID0gcmVwbGFjZShNRlJfZGVjLCBzZF9tZWFuX2lzaSRNRlJfZGVjIDwgMCwgMCkpDQpgYGANCjxicj4NCg0KIyMjIFJhbmtzIChzdHJlbmd0aCBvZiBpbmhpYml0aW9uKQ0KKipjZWxscmFua3MqKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiYXNlbGluZToNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmFzZVxfTUZSfXtiYXNlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KYGBge3J9DQpjZWxscmFua3MgPC0gYl9kX2FfTUZSICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9jb25kKSAlPiUNCiAgZHBseXI6Om11dGF0ZShiYXNlX01GUiA9IHNkX21lYW5faXNpJE1GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoYWN0aXZpdHlfY2hhbmdlID0gKChNRlIgLSBiYXNlX01GUikgLyBiYXNlX01GUiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihzdGltX2NvbmQgPT0gImQiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JQ0KICAgIHNlbGVjdChjZWxsX2lkLCBjb250cm9sLCBwaW5jaCwgcG9zaXRpb24pLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQpjZWxscmFua3MNCmBgYA0KDQoNCg0KKipjZWxscmFua3NfYmVmb3JlX3N0aW0qKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmVmb3JlIHN0aW11bHVzKiIgdG8gIipkdXJpbmcgc3RpbXVsdXMqIi4gSWYgdGhlIGFjdGl2aXR5IGNoYW5nZSBpcyBuZWdhdGl2ZSAoZGVjcmVhc2VkIE1GUikgdGhlIGFzaWduZWQgcmFuayBpcyBuZWdhdGl2ZSwgaWYgaXQgaXMgcG9zaXRpdmUgKGluY3JlYXNlZCBNRlIpIHRoZSBhc3NpZ25lZCByYW5rIGlzIHBvc2l0aXZlLg0KDQo8YnI+DQoNCkNhbGN1bGF0aW5nIHRoZSBmaXJpbmcgcmF0ZSBjaGFuZ2UgZHVyaW5nIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gYmVmb3JlIHN0aW11bHVzOg0KDQo8YnI+PGJyPjxicj4NCg0KJCRcbWF0aGJme2FjdGl2aXR5XF9jaGFuZ2V9ID0gXGZyYWN7ZHVyaW5nXF9NRlIgLSBiZWZvcmVcX01GUn17YmVmb3JlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KDQoNCmBgYHtyfQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltIDwtIGJfZF9hX01GUiAlPiUNCiAgc3ByZWFkKGtleSA9IHN0aW1fY29uZCwgdmFsdWUgPSBNRlIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGFjdGl2aXR5X2NoYW5nZSA9ICgoZCAtIGIpIC8gYiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoY2VsbF9pZCwgY29udHJvbCwgcGluY2gsIHBvc2l0aW9uKSwNCiAgYnkgPSAiY2VsbF9pZCINCiAgKQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCiMjIyBEYXRhIHRvIHBsb3QNCioqVE9fUExPVCoqOiBDb21iaW5pbmcgKmJfZF9hX01GUiogKGZpcmluZyByYXRlIG9mIDI5IElMIG5ldXJvbnMgYi9kL2Egc3RpbSkgd2l0aCAqc2RfbWVhbl9pc2kqIHRhYmxlIChiYXNlbGluZSBmaXJpbmcgcmF0ZSBvZiB0aGUgc2FtZSAyOSBuZXVyb25zKSwgam9pbmluZyB3aXRoIENFTExfSU5GTyBjb250YWluaW5nIGltcG9ydGFudCBpbmZvcm1hdGlvbiBvZiB0aGUgY2VsbHMgKGJhc2VsaW5lIGFjdGl2aXR5LCBpZGVudGlmaWVkLCBwaW5jaGVkLCBjb250cm9sKSBhbmQgd2l0aCAqY2VsbHJhbmtzKiBjb250YWluaW5nIHRoZSByYW5rcyBhc2lnbmVkIHRvIGVhY2ggY2VsbHMgYmFzZWQgb24gdGhlIGNoYW5nZXMgaW4gTUZSIGR1cmluZyB0aGUgc3RpbXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVE9fUExPVCA8LSBiaW5kX3Jvd3MoDQogIHNkX21lYW5faXNpICU+JQ0KICAgIHNlbGVjdChNRlIsIGNlbGxfaWQsIHN0aW1fY29uZCksDQogIGJfZF9hX01GUg0KKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoLWZpbGVfbmFtZSksDQogIGJ5ID0gImNlbGxfaWQiDQogICkgJT4lDQogIGxlZnRfam9pbihjZWxscmFua3MgJT4lDQogICAgc2VsZWN0KGNlbGxfaWQsIGNoYW5nZV9yYW5rLCBhY3Rpdml0eV9jaGFuZ2UpLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQoNCmRhdGF0YWJsZShUT19QTE9ULA0KICBjYXB0aW9uID0gIlRPX1BMT1QgdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj48YnI+DQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBCYXNlbGluZSB2cy4gImJlZm9yZSIgc3RpbXVsdXMgYWN0aXZpdHkNCg0KQ29tcGFyaXNvbiBvZiBiYXNlbGluZSBhbmQgImJlZm9yZSIgc3RpbXVsdXMgZmlyaW5nIHJhdGVzIGluIHRoZSBjYXNlIG9mIHNwb250YW5lb3VzbHkgYWN0aXZlIGFuZCBzcG9udGVuZW91c2x5IGluYWN0aXZlIChwaW5jaCkgbmV1cm9ucy4gU3BvbnRhbmVvdXNseSBpbmFjdGl2ZSBuZXVyb25zIHNob3dlZCBzaWduaWZpY2FudGx5IGhpZ2hlciBNRlIgYmVmb3JlIHN0aXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJiIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImIiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwaW5jaCksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gcGluY2gpDQogICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIHRoZW1lKA0KICAjICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICMgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgIyApICsNCiAgeGxhYigiUmVjb3JkaW5nIHBlcmlvZCIpICsNCiAgZmFjZXRfd3JhcCh2YXJzKHBpbmNoKSkgKw0KICBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLCBwYWlyZWQgPSBUKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBudWRnZV94ID0gLS45LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICAjIGhqdXN0ID0gMiwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIE1GUiBiZWZvcmUsIGR1cmluZyBhbmQgYWZ0ZXIgc3RpbXVsdXMgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAgLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImIiIHwgc3RpbV9jb25kID09ICJkIiB8IHN0aW1fY29uZCA9PSAiYSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IDApKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICMgdGhlbWUoDQogICMgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgIyAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICAjICkgKw0KICBnZ3RpdGxlKCJQaW5jaCIsICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICB5bGltKDAsIDM1KSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLA0KICAgIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCksDQogICAgY29sb3IgPSAiI0VCODEwNCINCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIG51ZGdlX3ggPSAwLjE1LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0wLjUsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpDQpgYGANCjxicj48YnI+DQoNCiMjIyBTdHJlbmd0aCBvZiBpbmhpYml0aW9uDQoNCkZpcmluZyByYXRlIGNoYW5nZSAqKmR1cmluZyoqIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gKipiYXNlbGluZSoqOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBjZWxscmFua3MsDQogIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKQ0KKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gRiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKA0KICAgIGRhdGEgPSBjZWxscmFua3MgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICkgKw0KDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIHRoZW1lKA0KICAjICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICMgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgIyApICsNCiAgeWxpbSgtbWF4KGNlbGxyYW5rcyRhY3Rpdml0eV9jaGFuZ2UpLCBtYXgoY2VsbHJhbmtzJGFjdGl2aXR5X2NoYW5nZSkpDQpgYGANCg0KPGJyPjxicj4NCg0KRmlyaW5nIHJhdGUgY2hhbmdlICoqZHVyaW5nKiogc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byAqKmJlZm9yZSoqIHN0aW11bHVzOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmdncGxvdCgNCiAgZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gY2hhbmdlX3JhbmssIHkgPSBhY3Rpdml0eV9jaGFuZ2UpDQopICsNCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IEYpLCBzaXplID0gNiwNCiAgICBhZXMoDQogICAgICBjb2wgPSBwb3NpdGlvbiwNCiAgICAgIHNoYXBlID0gcGluY2gNCiAgICApDQogICkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiSUwiID0gImdyZWVuIiwgInRyYW5zaWVudCIgPSAiYmx1ZSIsICJQRiIgPSAicmVkIiwgInVua25vd24iID0gImJsYWNrIiwgImNvbnRyb2wiID0gIm1hZ2VudGEiKSkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAiKyIsICJGQUxTRSIgPSAiLSIpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKA0KICAgIGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICkgKw0KDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIHRoZW1lKA0KICAjICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICMgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgIyApICsNCiAgeGxhYigiUmFua3MiKSArDQogIHlsYWIoIkNoYW5nZSBpbiBmaXJpbmcgcmF0ZSBbJV0iKSArDQogIHlsaW0oLW1heChjZWxscmFua3NfYmVmb3JlX3N0aW0kYWN0aXZpdHlfY2hhbmdlKSwgbWF4KGNlbGxyYW5rc19iZWZvcmVfc3RpbSRhY3Rpdml0eV9jaGFuZ2UpKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo8YnI+PGJyPg0KDQpQbG90dGluZyB0aGUgY2hhbmdlIGluIE1GUiBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBDb2xvcmluZyBiYXNlZCBvbiB0aGUgc3RyZW5ndGggb2YgdGhlIGluaGliaXRpb24gKCpyYW5rKikNCg0KYGBge3IsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJkIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IGNoYW5nZV9yYW5rKSwNCiAgICBzaGFwZSA9IDIxLA0KICAgICMgZmlsbCA9ICIjRUI4MTA0IiwNCiAgICAjIGNvbG9yID0gIndoaXRlIiwNCiAgICBzaXplID0gNA0KICApICsNCiAgIyBzdHJva2UgPSAyKSArDQogIGdlb21fbGluZSgNCiAgICBhZXMoZ3JvdXAgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuaykNCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuayksDQogICAgIyBudWRnZV94ID0gLS4xLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IDQsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogICMgdGhlbWUoDQogICMgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgIyAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICAjICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICBsYWJzKGZpbGwgPSAiUmFuayIsIGNvbCA9ICJSYW5rIikNCmBgYA0KDQoNCjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPg0KDQoNCiMgQWN0aXZpdHkgb2YgUFJGIGdseWNpbmVyZ2ljIGNlbGxzIGR1cmluZyBQRkMgcGhvdG9hY3RpdmF0aW9uDQoNCiMjIExvYWRpbmcgYW5kIHRyYW5zZm9ybWluZyAoaGlkZGVuIGNvZGUpIGRhdGENCg0KDQpgYGB7ciBsb2FkaW5nIGRhdGEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KUkVDT1JESU5HUyA8LSBDcmVhdGVSZWNUaWJibGUoDQogIEFQX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgImNvcnRpY2FsX3N0aW0iLCAiQVBfdGltZXMuY3N2IikpLA0KICBzdGltX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgImNvcnRpY2FsX3N0aW0iLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCg0KDQojIyMgQ0FSRUZVTCBXSVRIIFRISVMhISBJdCdzIGdlbmVyYXRlZCBieSB0aGUgIkNyZWF0ZVBTVEhUaWJibGUiIGZ1bmN0aW9uIGJ1dCB0aGUgZnJlcXVlbmNpZXMgaGF2ZSB0byBiZSBjaGFuZ2VkIG1hbnVhbGx5LCBhbmQgaXQgY2FuIGNyZWF0ZSBkdXBsaWNhdGVzISBJIGhhdmUgdG8gd29yayBvbiB0aGF0IQ0KU1RJTV9SRVNVTFRTIDwtIHJlYWRfY3N2KGZpbGUucGF0aCgib3V0cHV0X2RhdGEiLCAiY29ydGljYWxfc3RpbV9hbmFseXNpcy5jc3YiKSkNCmBgYA0KDQoNCmBgYHtyIHRyYW5zZm9ybWluZyBkYXRhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIGFkZGluZyBzdGltdWx1cyBudW1iZXIgd2l0aGluIHRyYWluDQpSRUNPUkRJTkdTIDwtIFJFQ09SRElOR1MgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9udW1iZXIgPSAwKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbXVsdXMgbnVtYmVyIHdpdGhpbiB0cmFpbg0KaW5pdGlhbF92YWx1ZSA8LSBSRUNPUkRJTkdTJHN0aW1fZnJlcVsxXSAlPiUNCiAgYGNvbW1lbnQ8LWAoIkZpcnN0IHZhbHVlIG9mIHN0aW1fZnJlcSB2YXJpYWJsZS4gV2hlbiBpdCBjaGFuZ2VzIHN0aW11bHVzIGNvdW50aW5nIHJlc3RhcnRzIikNCg0Kc3RpbV9jb3VudGVyIDwtIDEgJT4lDQogIGBjb21tZW50PC1gKCJDb3VudHMgc3RpbXVsaSBpbiBhIHRyYWluIikNCmluZGV4IDwtIDEgJT4lDQogIGBjb21tZW50PC1gKCJUcmFja3MgdGhlIHBvc2l0aW9uIChpbmRleCkgb2Ygc3RpbV9mcmVxIikNCg0KUkVDT1JESU5HUyRzdGltX251bWJlclsxXSA8LSBzdGltX2NvdW50ZXINCnJlcGVhdHsNCiAgaWYgKFJFQ09SRElOR1Mkc3RpbV9mcmVxW2luZGV4ICsgMV0gPT0gaW5pdGlhbF92YWx1ZSkgew0KICAgIFJFQ09SRElOR1Mkc3RpbV9udW1iZXJbaW5kZXggKyAxXSA8LSBzdGltX2NvdW50ZXIgKyAxDQogICAgc3RpbV9jb3VudGVyIDwtIHN0aW1fY291bnRlciArIDENCiAgICBpbmRleCA8LSBpbmRleCArIDENCiAgfSBlbHNlIHsNCiAgICBpbml0aWFsX3ZhbHVlIDwtIFJFQ09SRElOR1Mkc3RpbV9mcmVxW2luZGV4ICsgMV0NCiAgICBzdGltX2NvdW50ZXIgPC0gMQ0KICAgIFJFQ09SRElOR1Mkc3RpbV9udW1iZXJbaW5kZXggKyAxXSA8LSBzdGltX2NvdW50ZXINCiAgICBpbmRleCA8LSBpbmRleCArIDENCiAgfQ0KDQogIGlmIChpbmRleCA9PSBsZW5ndGgoUkVDT1JESU5HUyRzdGltX251bWJlcikpIHsNCiAgICBicmVhaw0KICB9DQp9DQoNCiMjIyByZXBsYWNpbmcgc3RpbV9udW1iZXIgd2l0aCBOQSBhdCAiQVAiDQpSRUNPUkRJTkdTJHN0aW1fbnVtYmVyW1JFQ09SRElOR1Mkc2lnbmFsX3R5cGUgPT0gIkFQIl0gPC0gTkENCg0KIyMjIGNhdGVnb3JpemluZyBzdGltdWxpDQpSRUNPUkRJTkdTIDwtIFJFQ09SRElOR1MgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gc3RpbV9mcmVxKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXFfY2F0ZWcgPSByZXBsYWNlKA0KICAgIHggPSBzdGltX2ZyZXFfY2F0ZWcsDQogICAgbGlzdCA9IChzdGltX2ZyZXFfY2F0ZWcgPT0gMTIgfCBzdGltX2ZyZXFfY2F0ZWcgPT0gOCksDQogICAgdmFsdWVzID0gMTANCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gcmVwbGFjZSgNCiAgICB4ID0gc3RpbV9mcmVxX2NhdGVnLA0KICAgIGxpc3QgPSAoc3RpbV9mcmVxX2NhdGVnID09IDE4KSwNCiAgICB2YWx1ZXMgPSAyMA0KICApKQ0KYGBgDQoNCmBgYHtyIGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJIaXN0U3RhdHMuUiIpKQ0KDQpTVElNX1JFU1VMVFMgJT4lDQogIGRwbHlyOjpncm91cF9ieShmcmVxKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShuX3RpbWVzID0gbGVuZ3RoKHVuaXF1ZShhbmltYWxfaWQpKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgYXMubWF0cml4KCkgJT4lDQogIHVubmFtZSgpIC0+IHJlcF9tYXRyaXgNCg0KIyMjIHNldCBQU1RIIHJhbmdlDQpQU1RIX3JhbmdlIDwtIGMoLTAuMDEsIDAuMDQpDQoNCg0KaGlzdF9zdGF0cyA8LSBTVElNX1JFU1VMVFMgJT4lDQogIGRwbHlyOjpmaWx0ZXIoDQogICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXQ0KICApICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZnJlcSkgJT4lDQogIGRvKGdwX2hpc3QgPSBnZ3Bsb3QoDQogICAgZGF0YSA9IC4sDQogICAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQogICkgKw0KICAgIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gYW5pbWFsX2lkKSwgYmlud2lkdGggPSAwLjAwMSkgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICAgIG5hbWUgPSAiQW5pbWFsIg0KICAgICAgIyBndWlkZSA9IEZBTFNFDQogICAgKSArDQogICAgZmFjZXRfd3JhcCh+YW5pbWFsX2lkLCBuY29sID0gMykgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgICB4bGFiKCJUaW1lIChzKSIpICsNCiAgICB5bGFiKCJDb3VudCIpICsNCiAgICBnZ3RpdGxlKHBhc3RlMCguJGZyZXEsICIgSHoiKSkpICU+JQ0KICBgW1tgKDIpICU+JQ0KICBsYXBwbHkoLiAlPiUgSGlzdFN0YXRzKCkgJT4lIGFzLnRpYmJsZSgpKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFkZF9jb2x1bW4oDQogICAgZnJlcSA9IGMoDQogICAgICByZXAocmVwX21hdHJpeFsxLCAxXSwgcmVwX21hdHJpeFsxLCAyXSksDQogICAgICByZXAocmVwX21hdHJpeFsyLCAxXSwgcmVwX21hdHJpeFsyLCAyXSksDQogICAgICByZXAocmVwX21hdHJpeFszLCAxXSwgcmVwX21hdHJpeFszLCAyXSkNCiAgICApLA0KICAgIC5hZnRlciA9ICJhbmltYWxfaWQiDQogICkNCmBgYA0KDQoNCmBgYHtyIGNhbGN1bGF0aW5nIHJlc3BvbnNlIHByb2IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpSRVNQX1BST0IgPC0gbGVmdF9qb2luKA0KICBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXQ0KICAgICkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgZnJlcSkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShOb19BUHMgPSBsZW5ndGgoZmlyc3RfYXBfcmVsdGltZXMpKSAlPiUNCiAgICBkcGx5cjo6cmVuYW1lKHN0aW1fZnJlcSA9IGZyZXEpICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxID0gcmVwbGFjZShzdGltX2ZyZXEsIHN0aW1fZnJlcSA9PSAxOCwgMjApKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcSA9IHJlcGxhY2Uoc3RpbV9mcmVxLCBzdGltX2ZyZXEgPT0gOCwgMTApKSwNCg0KICBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iLCBzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIikpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZykgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShOb19zdGltID0gbGVuZ3RoKHNpZ25hbF90aW1lKSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXEgPSBhcy5udW1lcmljKHN0aW1fZnJlcV9jYXRlZykpICU+JQ0KICAgIHNlbGVjdCgtc3RpbV9mcmVxX2NhdGVnKQ0KKSAlPiUNCiAgYWRkX2NvbHVtbihOb19BUHNfcmFuZ2UgPSBoaXN0X3N0YXRzICU+JQ0KICAgIGFycmFuZ2UoYW5pbWFsX2lkKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKGZyZXEgPSByZXBsYWNlKGZyZXEsIGZyZXEgPT0gMTgsIDIwKSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmcmVxID0gcmVwbGFjZShmcmVxLCBmcmVxID09IDgsIDEwKSkgJT4lDQogICAgZHBseXI6OnJlbmFtZShzdGltX2ZyZXEgPSBmcmVxKSAlPiUgcHVsbChyYW5nZV9jb3VudF9zdW0pKSAlPiUNCiAgZHBseXI6Om11dGF0ZShyZXNwX3Byb2IgPSAoTm9fQVBzIC8gTm9fc3RpbSkgKiAxMDApICU+JQ0KICBkcGx5cjo6bXV0YXRlKHJlc3BfcHJvYl9yYW5nZSA9IChOb19BUHNfcmFuZ2UgLyBOb19zdGltKSAqIDEwMCkgJT4lDQogIGFkZF9jb2x1bW4ocGVha19sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUNCiAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgcHVsbChwZWFrKSkgJT4lDQogIGFkZF9jb2x1bW4obWVhbl9sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUNCiAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgcHVsbChtZWFuKSkNCmBgYA0KDQpgYGB7ciBjYWxjdWxhdGluZyBBUCBjb3VudCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCkFQQ291bnQgPC0gZnVuY3Rpb24oYW5pbWFsKSB7DQogIHRtcF9hcCA8LSBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gIkFQIiwgYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkNCg0KICBzdGltX3RyYWlucyA8LSBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKA0KICAgICAgbGFnX3NmYyA9IGxhZyhzdGltX2ZyZXEpLA0KICAgICAgdG1wX3ZhciA9IGlmZWxzZShsYWdfc2ZjID09IHN0aW1fZnJlcSAmICFpcy5uYShsYWdfc2ZjKSwgMCwgMSksDQogICAgICBjdW1fdG1wX3ZhciA9IGN1bXN1bSh0bXBfdmFyKQ0KICAgICkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgc3RpbV9mcmVxLCBjdW1fdG1wX3ZhcikgJT4lDQogICAgZHBseXI6Om11dGF0ZSh0cmFpbl9udW1iZXIgPSBncm91cF9pbmRpY2VzKCkpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoLWxhZ19zZmMsIC10bXBfdmFyLCAtY3VtX3RtcF92YXIpICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KHN0aW1fZnJlcV9jYXRlZywgdHJhaW5fbnVtYmVyLCBzdGltX251bWJlcikgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICAgIE5vX0FQcyA9IGxlbmd0aCh0bXBfYXBbdG1wX2FwID4gc2lnbmFsX3RpbWUgJiB0bXBfYXAgPCBzaWduYWxfdGltZSArIDAuMDVdKSwNCiAgICAgIEFQX3RpbWVzID0gcGFzdGUodG1wX2FwW3RtcF9hcCA+IHNpZ25hbF90aW1lICYgdG1wX2FwIDwgc2lnbmFsX3RpbWUgKyAwLjA1XSwgY29sbGFwc2UgPSAiLCIpLA0KICAgICAgcmFuZ2VfbG93ZXIgPSBzaWduYWxfdGltZSwNCiAgICAgIHJhbmdlX3VwcGVyID0gc2lnbmFsX3RpbWUgKyAwLjA1DQogICAgKSAlPiUNCiAgICBhZGRfY29sdW1uKGFuaW1hbF9pZCA9IGFuaW1hbCwgLmJlZm9yZSA9IDEpICU+JQ0KICAgIHVuZ3JvdXAoKQ0KICByZXR1cm4oc3RpbV90cmFpbnMpDQp9DQoNCkFQQyA8LSBsYXBwbHkoUkVDT1JESU5HUyRhbmltYWxfaWQgJT4lIHVuaXF1ZSgpLCBBUENvdW50KSAlPiUgYmluZF9yb3dzKCkNCmBgYA0KDQoNCiogTGlzdCBvZiB0aWJibGVzIHVzZWQgdG8gc3RvcmUgZGF0YToNCiAgKyBSRUNPUkRJTkdTIHRpYmJsZTogc3RvcmVzIEFQIGFuZCBzdGltIHRpbWUgc3RhbXBzLCBudW1iZXIgb2Ygc3RpbXVsaSBpbiBlYWNoIHRyYWluLCBzdGltdWx1cyBmcmVxdWVuY3kgY2F0ZWdvcmllcyAoZWcuIDggMTAgYW5kIDEyIEh6IGJlbG9uZyB0byAxMCBIeiBjYXRlZ29yeSkNCiAgKyBTVElNX1JFU1VMVFM6IHN0b3JlcyB0aGUgZGF0YSBmb3IgUFNUSHMgKENBUkVGVUwgV0lUSCBUSElTISEgSXQncyBnZW5lcmF0ZWQgYnkgdGhlICJDcmVhdGVQU1RIVGliYmxlIiBmdW5jdGlvbiBidXQgdGhlIGZyZXF1ZW5jaWVzIGhhdmUgdG8gYmUgY2hhbmdlZCBtYW51YWxseSwgYW5kIGl0IGNhbiBjcmVhdGUgZHVwbGljYXRlcyEgSSBoYXZlIHRvIHdvcmsgb24gdGhhdCEgSWYgc29tZXRoaW5nIGRvZXNuJ3QgbG9vayByaWdodCBvbiBQU1RIcyBvciByZXNwb25zZSBwcm9iYWJpbGl0eSBwbG90cywgY2hlY2sgdGhpcyBvbmUgZmlyc3QpDQogICsgaGlzdF9zdGF0czogc3RvcmVzIFBTVEggc3RhdGlzdGljcyBjYWxjdWxhdGVkIGZyb20gZ2dwbG90IA0KICArIFJFU1BfUFJPQjogcmVzcG9uc2UgcHJvYmFiaWxpdHkgYW5kIGxhdGVuY3kgZGF0YSBjYWxjdWxhdGVkIGZyb20gc3RpbSByZXN1bHRzIGFuZCByZWNvcmRpbmdzDQogICsgQVBDOiBudW1iZXIgb2YgQVBzIGFmdGVyIGVhY2ggc3RpbXVsdXMgaW4gYSA1MCBtcyB3aW5kb3cNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFJFQ09SRElOR1MsDQogIGNhcHRpb24gPSAiUkVDT1JESU5HUyB0aWJibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFNUSU1fUkVTVUxUUywNCiAgY2FwdGlvbiA9ICJTVElNX1JFU1VMVFMgdGliYmxlIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmRhdGF0YWJsZShoaXN0X3N0YXRzLA0KICBjYXB0aW9uID0gIlBTVEggc3RhdGlzdGljcyAoaGlzdF9zdGF0cyB0aWJibGUpIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRhdGFibGUoUkVTUF9QUk9CLA0KICBjYXB0aW9uID0gIlJlc3BvbnNlIHByb2JhYmlsaXRpZXMiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGF0YWJsZShBUEMsDQogIGNhcHRpb24gPSAiTnVtYmVyIG9mIEFQcyBmb2xvd2luZyBlYWNoIHN0aW11bHVzIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCg0KIyMgUGxvdHRpbmcNCg0KIyMjIERpc3RyaWJ1dGlvbiBvZiBmcmlzdCBBUHMgYWZ0ZXIgY29ydGljYWwgYWN0aXZhdGlvbg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiZ2VvbV9mbGF0X3Zpb2xpbi5SIikpDQojIFBTVEhfcmFuZ2UgPC0gYygwLCAwLjA1KQ0KZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0NCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHkgPSBmaXJzdF9hcF9yZWx0aW1lcywgeCA9IGFuaW1hbF9pZCkNCikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZ2hhbHZlczo6Z2VvbV9oYWxmX3Zpb2xpbihzaWRlID0gInIiLCB0cmltID0gVCwgc2NhbGUgPSAid2lkdGgiKSArDQogICMgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAieSIsDQogICMgICAgICAgICAgICAgIGRvdHNpemUgPSA0LA0KICAjICAgICAgICAgICAgICBzdGFja2RpciA9ICJkb3duIiwNCiAgIyAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjAwMDIsbWV0aG9kID0gImhpc3RvZG90IixiaW5wb3NpdGlvbnMgPSAiYWxsIiwNCiAgIyAgICAgICAgICAgICAgKSArDQogICMgc2VlOjpnZW9tX3Zpb2xpbmRvdChiaW53aWR0aCA9IDAuMDAwMSxzaXplX2RvdHMgPSA2LCkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwKSwgc2hhcGUgPSAifCIpICsNCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMSwgb3V0bGllci5jb2xvdXIgPSBOQSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgZmFjZXRfd3JhcCh+ZnJlcSkNCmBgYA0KDQojIyMgUFNUSCBAIDEgSHogY29ydGljYWwgYWN0aXZhdGlvbg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgbWFpbiBwbG90DQoNCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDEgJT4lIGFzLmNoYXJhY3RlcigpDQoNCmdwX2hpc3QgPC0gZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0sDQogICAgICBmcmVxID09IGZyZXFfdG9fcGxvdA0KICAgICAgIyBhbmltYWxfaWQgPT0gIkdJSV8yMSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHggPSBmaXJzdF9hcF9yZWx0aW1lcykNCikgKw0KICB4bGltKFBTVEhfcmFuZ2VbMV0sIFBTVEhfcmFuZ2VbMl0pICsNCiAgZ2VvbV9oaXN0b2dyYW0oDQogICAgIyBhZXMoZmlsbCA9IGFuaW1hbF9pZCksDQogICAgYmlud2lkdGggPSAwLjAwMQ0KICApICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICBuYW1lID0gIkFuaW1hbCINCiAgICAjIGd1aWRlID0gRkFMU0UNCiAgKSArDQogIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICB4bGFiKCJUaW1lIChzKSIpICsNCiAgeWxhYigiQ291bnQiKQ0KDQoNCg0KIyMjIGxpbmVzDQpncF9oaXN0ICsNCiAgIyMjIG1lZGlhbg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gbWVkaWFuLA0KICAgICAgeGVuZCA9IG1lZGlhbiwNCiAgICAgIHkgPSB5X21heCArIDcsDQogICAgICB5ZW5kID0geV9tYXggKyAxOA0KICAgICksDQogICAgc2l6ZSA9IDENCiAgKSArDQoNCiAgIyMjIGRhdGEgcmFuZ2UNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IHF1YW50aWxlMjUgLSAxLjUgKiBJUVIsDQogICAgICB4ZW5kID0gcXVhbnRpbGUyNSwNCiAgICAgIHkgPSB5X21heCArIDEyLjUsDQogICAgICB5ZW5kID0geV9tYXggKyAxMi41DQogICAgKQ0KICApICsNCg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHF1YW50aWxlNzUsIHhlbmQgPSBxdWFudGlsZTc1ICsgMS41ICogSVFSLCB5ID0geV9tYXggKyAxMi41LCB5ZW5kID0geV9tYXggKyAxMi41KQ0KICApICsNCg0KICAjIyMgSVFSIChib3gpDQogIGdlb21fcmVjdCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4bWluID0gcXVhbnRpbGUyNSwgeG1heCA9IHF1YW50aWxlNzUsIHltaW4gPSB5X21heCArIDcsIHltYXggPSB5X21heCArIDE4KSwNCiAgICBjb2xvciA9ICJyZWQiLA0KICAgIGFscGhhID0gMCwNCiAgICBpbmhlcml0LmFlcyA9IEYNCiAgKSArDQoNCiAgIyMjIG1lYW4NCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbiwgeSA9IHlfbWF4ICsgNCksIHNpemUgPSAyDQogICkgKw0KDQogICMjIyBwZWFrDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBlYWssIHkgPSB5X21heCArIDQpLA0KICAgIHNoYXBlID0gMjUsDQogICAgc2l6ZSA9IDIsDQogICAgZmlsbCA9ICJyZWQiDQogICkNCmBgYA0KDQojIyMgUFNUSCBAIDEwIEh6IGNvcnRpY2FsIGFjdGl2YXRpb24NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIG1haW4gcGxvdA0KDQojIyMgc2V0IFBTVEggcmFuZ2U6IHNlZSBlYXJsaWVyIChjYWxjdWxhdGluZyBoaXN0IHN0YXRzIGNodW5rKQ0KDQojIyMgc2VsZWN0IGZyZXF1ZW5jeSB0byBwbG90ICgxLCA4LCAxOCkNCmZyZXFfdG9fcGxvdCA8LSA4ICU+JSBhcy5jaGFyYWN0ZXIoKQ0KDQpncF9oaXN0IDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSBmcmVxX3RvX3Bsb3QNCiAgICAgICMgYW5pbWFsX2lkID09ICJHSUlfMjEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQopICsNCiAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogIGdlb21faGlzdG9ncmFtKA0KICAgICMgYWVzKGZpbGwgPSBhbmltYWxfaWQpLA0KICAgIGJpbndpZHRoID0gMC4wMDENCiAgKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgIHBhbGV0dGUgPSAiU2V0MyIsDQogICAgbmFtZSA9ICJBbmltYWwiDQogICAgIyBndWlkZSA9IEZBTFNFDQogICkgKw0KICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgeGxhYigiVGltZSAocykiKSArDQogIHlsYWIoIkNvdW50IikNCg0KDQoNCiMjIyBsaW5lcw0KZ3BfaGlzdCArDQogICMjIyBtZWRpYW4NCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IG1lZGlhbiwNCiAgICAgIHhlbmQgPSBtZWRpYW4sDQogICAgICB5ID0geV9tYXggKyA3LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTgNCiAgICApLA0KICAgIHNpemUgPSAxDQogICkgKw0KDQogICMjIyBkYXRhIHJhbmdlDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBxdWFudGlsZTI1IC0gMS41ICogSVFSLA0KICAgICAgeGVuZCA9IHF1YW50aWxlMjUsDQogICAgICB5ID0geV9tYXggKyAxMi41LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTIuNQ0KICAgICkNCiAgKSArDQoNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBxdWFudGlsZTc1LCB4ZW5kID0gcXVhbnRpbGU3NSArIDEuNSAqIElRUiwgeSA9IHlfbWF4ICsgMTIuNSwgeWVuZCA9IHlfbWF4ICsgMTIuNSkNCiAgKSArDQoNCiAgIyMjIElRUiAoYm94KQ0KICBnZW9tX3JlY3QoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeG1pbiA9IHF1YW50aWxlMjUsIHhtYXggPSBxdWFudGlsZTc1LCB5bWluID0geV9tYXggKyA3LCB5bWF4ID0geV9tYXggKyAxOCksDQogICAgY29sb3IgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAsDQogICAgaW5oZXJpdC5hZXMgPSBGDQogICkgKw0KDQogICMjIyBtZWFuDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1lYW4sIHkgPSB5X21heCArIDQpLCBzaXplID0gMg0KICApICsNCg0KICAjIyMgcGVhaw0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBwZWFrLCB5ID0geV9tYXggKyA0KSwNCiAgICBzaGFwZSA9IDI1LA0KICAgIHNpemUgPSAyLA0KICAgIGZpbGwgPSAicmVkIg0KICApDQpgYGANCg0KIyMjIFBTVEggQCAyMCBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIG1haW4gcGxvdA0KDQojIyMgc2V0IFBTVEggcmFuZ2U6IHNlZSBlYXJsaWVyIChjYWxjdWxhdGluZyBoaXN0IHN0YXRzIGNodW5rKQ0KDQojIyMgc2VsZWN0IGZyZXF1ZW5jeSB0byBwbG90ICgxLCA4LCAxOCkNCmZyZXFfdG9fcGxvdCA8LSAxOCAlPiUgYXMuY2hhcmFjdGVyKCkNCg0KZ3BfaGlzdCA8LSBnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXSwNCiAgICAgIGZyZXEgPT0gZnJlcV90b19wbG90DQogICAgICAjIGFuaW1hbF9pZCA9PSAiR0lJXzIxIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KKSArDQogIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgNCiAgICAjIGFlcyhmaWxsID0gYW5pbWFsX2lkKSwNCiAgICBiaW53aWR0aCA9IDAuMDAxDQogICkgKw0KICBzY2FsZV9maWxsX2JyZXdlcigNCiAgICBwYWxldHRlID0gIlNldDMiLA0KICAgIG5hbWUgPSAiQW5pbWFsIg0KICAgICMgZ3VpZGUgPSBGQUxTRQ0KICApICsNCiAgZmFjZXRfd3JhcCh+YW5pbWFsX2lkLCBuY29sID0gMykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArDQogIHhsYWIoIlRpbWUgKHMpIikgKw0KICB5bGFiKCJDb3VudCIpDQoNCg0KDQojIyMgbGluZXMNCmdwX2hpc3QgKw0KICAjIyMgbWVkaWFuDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBtZWRpYW4sDQogICAgICB4ZW5kID0gbWVkaWFuLA0KICAgICAgeSA9IHlfbWF4ICsgNywNCiAgICAgIHllbmQgPSB5X21heCArIDE4DQogICAgKSwNCiAgICBzaXplID0gMQ0KICApICsNCg0KICAjIyMgZGF0YSByYW5nZQ0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gcXVhbnRpbGUyNSAtIDEuNSAqIElRUiwNCiAgICAgIHhlbmQgPSBxdWFudGlsZTI1LA0KICAgICAgeSA9IHlfbWF4ICsgMTIuNSwNCiAgICAgIHllbmQgPSB5X21heCArIDEyLjUNCiAgICApDQogICkgKw0KDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcXVhbnRpbGU3NSwgeGVuZCA9IHF1YW50aWxlNzUgKyAxLjUgKiBJUVIsIHkgPSB5X21heCArIDEyLjUsIHllbmQgPSB5X21heCArIDEyLjUpDQogICkgKw0KDQogICMjIyBJUVIgKGJveCkNCiAgZ2VvbV9yZWN0KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHhtaW4gPSBxdWFudGlsZTI1LCB4bWF4ID0gcXVhbnRpbGU3NSwgeW1pbiA9IHlfbWF4ICsgNywgeW1heCA9IHlfbWF4ICsgMTgpLA0KICAgIGNvbG9yID0gInJlZCIsDQogICAgYWxwaGEgPSAwLA0KICAgIGluaGVyaXQuYWVzID0gRg0KICApICsNCg0KICAjIyMgbWVhbg0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBtZWFuLCB5ID0geV9tYXggKyA0KSwgc2l6ZSA9IDINCiAgKSArDQoNCiAgIyMjIHBlYWsNCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcGVhaywgeSA9IHlfbWF4ICsgNCksDQogICAgc2hhcGUgPSAyNSwNCiAgICBzaXplID0gMiwNCiAgICBmaWxsID0gInJlZCINCiAgKQ0KYGBgDQoNCg0KIyMjIFJlc3BvbnNlIHByb2JhYmlsaXR5IGFuZCBsYXRlbmN5DQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFJFU1BfUFJPQiwgIyAlPiUNCiAgIyBkcGx5cjo6ZmlsdGVyKGFuaW1hbF9pZCAhPSAiR0lJXzIwIiksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGFzLmZhY3RvcihzdGltX2ZyZXEpLA0KICAgIHkgPSByZXNwX3Byb2JfcmFuZ2UNCiAgKQ0KKSArDQogIGdlb21fYm94cGxvdChhbHBoYSA9IDAsIHdpZHRoID0gMC4yLCBsd2QgPSAxLCBmYXR0ZW4gPSAxLjIpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoDQogICAgICAjIGZpbGwgPSBhbmltYWxfaWQNCiAgICApLA0KICAgIGZpbGwgPSAiZ3JheSIsDQogICAgY29sb3IgPSAiYmxhY2siLA0KICAgIHNpemUgPSAzLA0KICAgIHNoYXBlID0gMjEsDQogICAgIyBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpDQogICkgKw0KICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBhbmltYWxfaWQpKSArDQogIHhsYWIoIlN0aW11bHVzIGZyZXF1ZW5jeSIpICsNCiAgeWxhYigiUmVzcG9uc2UgcHJvYmFiaWxpdHkiKSArDQogIGdlb21fc2lnbmlmKA0KICAgIGNvbXBhcmlzb25zID0gbGlzdChjKCIxIiwgIjEwIikpLA0KICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgIHRlc3QgPSAibW9vZC50ZXN0IiwNCiAgICBjb2xvciA9ICJncmF5Ig0KICApICsNCiAgZ2VvbV9zaWduaWYoDQogICAgY29tcGFyaXNvbnMgPSBsaXN0KGMoIjEwIiwgIjIwIikpLA0KICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgIHRlc3QgPSAibW9vZC50ZXN0IiwNCiAgICBtYXJnaW5fdG9wID0gLjEsDQogICAgY29sb3IgPSAiZ3JheSINCiAgKSArDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBhZXMobGFiZWwgPSBhbmltYWxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0uNQ0KICApDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFJFU1BfUFJPQiAlPiUNCiAgICBnYXRoZXIoDQogICAgICBrZXkgPSAibGF0ZW5jeV90eXBlIiwNCiAgICAgIHZhbHVlID0gImxhdGVuY3lfdmFsdWUiLA0KICAgICAgcGVha19sYXRlbmN5LA0KICAgICAgbWVhbl9sYXRlbmN5DQogICAgKSAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGFuaW1hbF9pZCAhPSAiR0lJXzIwIiksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGFzLmZhY3RvcihzdGltX2ZyZXEpLA0KICAgIHkgPSBsYXRlbmN5X3ZhbHVlICogMTAwMA0KICApDQopICsNCiAgIyMjIGRhdGEgdmlzdWFsaXphdGlvbiBsYXllcnMNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoZmlsbCA9IGxhdGVuY3lfdHlwZSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjQpLA0KICAgIHNpemUgPSAzLA0KICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICBzaGFwZSA9IDIxDQogICkgKw0KICBnZW9tX2JveHBsb3QoDQogICAgYWVzKGNvbG9yID0gbGF0ZW5jeV90eXBlKSwNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuNCksDQogICAgd2lkdGggPSAwLjMsDQogICAgYWxwaGEgPSAwLA0KICAgIGx3ZCA9IDEsDQogICAgZmF0dGVuID0gMS4yDQogICkgKw0KICB5bGltKDAsIDI1KSArDQogIHhsYWIoIlN0aW11bHVzIGZyZXF1ZW5jeSIpICsNCiAgeWxhYigiUGVhayBsYXRlbmN5IikgKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZSgNCiAgICBuYW1lID0gIkxhdGVuY3kiLA0KICAgIGJyZWFrcyA9IGMoIm1lYW5fbGF0ZW5jeSIsICJwZWFrX2xhdGVuY3kiKSwNCiAgICBsYWJlbHMgPSBjKCJNZWFuIiwgIlBlYWsiKSwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGNvbG9yID0gYyhyZXAoTkEsIDIpKSkpDQogICkgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKA0KICAgIG5hbWUgPSAiTGF0ZW5jeSIsDQogICAgYnJlYWtzID0gYygibWVhbl9sYXRlbmN5IiwgInBlYWtfbGF0ZW5jeSIpLA0KICAgIGxhYmVscyA9IGMoIk1lYW4iLCAiUGVhayIpDQogICkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQoNCiMjIyBOdW1iZXIgb2YgQVBzIGFmdGVyIGVhY2ggc3RpbXVsdXMgaW4gc3RpbXVsdXMgdHJhaW5zICg1MCBtcyB3aW5kb3cpDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gQVBDICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3RpbV9mcmVxX2NhdGVnICVpbiUgYygiMSIsICIxMCIsICIyMCIpLCBzdGltX251bWJlciA8IDExKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkLCBzdGltX2ZyZXFfY2F0ZWcsIHN0aW1fbnVtYmVyKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX0FQcyA9IHN1bShOb19BUHMpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgICBOb19BUF9tZWFuID0gbWVhbihOb19BUHMpLA0KICAgICAgTm9fQVBfc2QgPSBzZChOb19BUHMpLA0KICAgICAgU0VNID0gc2QoTm9fQVBzKSAvIHNxcnQobGVuZ3RoKE5vX0FQcykpDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gc3RpbV9udW1iZXIsDQogICAgeSA9IE5vX0FQX21lYW4sDQogICAgY29sb3VyID0gYXMuZmFjdG9yKHN0aW1fZnJlcV9jYXRlZyksDQogICAgZ3JvdXAgPSBhcy5mYWN0b3Ioc3RpbV9mcmVxX2NhdGVnKQ0KICApDQopICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICB4bGFiKCJOby4gc3RpbXVsdXMgaW4gdHJhaW4iKSArDQogIHlsYWIoIk1lYW4gbm8uIEFQcyBhY2Nyb3NzIGFuaW1hbHMiKSArDQogIGxhYnMoY29sb3IgPSAiRnJlcXVlbmN5IikgKw0KICB5bGltKDAsIDE4KSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYXMuY2hhcmFjdGVyKGMoMToxMCkpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gQVBDICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3RpbV9mcmVxX2NhdGVnICVpbiUgYygiMSIsICIxMCIsICIyMCIpLCBzdGltX251bWJlciA8IDExKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkLCBzdGltX2ZyZXFfY2F0ZWcsIHN0aW1fbnVtYmVyKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX0FQcyA9IHN1bShOb19BUHMpKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gc3RpbV9udW1iZXIsDQogICAgeSA9IE5vX0FQcywNCiAgICBjb2xvciA9IGFzLmZhY3RvcihhbmltYWxfaWQpLA0KICAgIGxpbmV0eXBlID0gYXMuZmFjdG9yKGFuaW1hbF9pZCkNCiAgKQ0KKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fbGluZSgpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKDE6MTApLCBicmVha3MgPSBjKDE6MTApKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IC4gJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN0aW1fbnVtYmVyID09IDEwKSwNCiAgICBhZXMobGFiZWwgPSBhbmltYWxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0yLA0KICAgIGFscGhhID0gLjcNCiAgKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IDEyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KDQogICMgeGxpbSgxLDEwKSArDQogIGZhY2V0X3dyYXAofnN0aW1fZnJlcV9jYXRlZykgKw0KICBsYWJzKGxpbmV0eXBlID0gIkFuaW1hbHMiLCBjb2xvciA9ICJBbmltYWxzIikgKw0KICB4bGFiKCJOby4gc3RpbXVsdXMgaW4gdHJhaW4iKSArDQogIHlsYWIoIk51bWJlciBvZiBBUHMiKQ0KYGBgDQoNCg0KDQojIFNwb250YW5lb3VzIGRlc3luY2hyb25pemF0aW9uIG9mIHRoZSBGQyBzbG93IG9zY2lsbGF0aW9uIA0KDQojIyBMb2FkaW5nIGRhdGEgDQoNCkxvYWRpbmcgbWF0IGZpbGVzIHRvICpmaWxlX2xpc3QqIG9iamVjdA0KDQpFeGFtcGxlIGZpbGU6ICoqMDhfcmlnaHRfUG5PX3Q1XzQwODNfYmFzZWxpbmUxX3dha2UubWF0IioqDQoNCmBgYHtyLCAgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpmaWxlX2xpc3QgPC0gbGlzdC5maWxlcygNCiAgcGF0aCA9ICJkYXRhIiwNCiAgcGF0dGVybiA9ICIqLm1hdCIsIGZ1bGwubmFtZXMgPSBGLCByZWN1cnNpdmUgPSBGDQopDQoNCmBgYA0KDQpDb250ZW50IG9mIG1hdCBmaWxlczoNCg0KKiBBUCBjaGFubmVsDQogICsgKip0aXRsZToqKiBjaGFubmVsIG5hbWUNCiAgKyAqKmNvbW1lbnQ6Kiogbm90ZXMgYWJvdXQgdGhlIGNoYW5uZWwNCiAgKyAqKnJlc29sdXRpb246KiogMi41ZS0wNg0KICArICoqaW50ZXJ2YWw6KiogdGltZSBiZXR3ZWVuIHR3byBkYXRhIHBvaW50cyBpbiBzZWMgKDVlLTA1KQ0KICArICoqc2NhbGU6Kiogc2NhbGluZyBmYWN0b3IgKHkgc2NhbGUpLCByZWFsID0gKGRhdGEgKiBzY2FsZSkgKyBvZmZzZXQNCiAgKyAqKm9mZnNldDoqKiBzY2FsZSBvZmZzZXQNCiAgKyAqKnVuaXRzOioqIHVuaXQgb2YgdGhlIGNoYW5uZWwgKHZvbHQpDQogICsgKipsZW5ndGg6KiogbnVtYmVyIG9mIEFQcw0KICArICoqaXRlbXM6KiogTm8uIHBvaW50cyBlYXNjaCBBUCBpcyByZXByZXNlbnRlZCBieQ0KICArICoqdHJpZ2dlcjoqKg0KICArICoqdHJhY2VzOioqDQogICsgKip0aW1lczoqKiB0aW1lcyBvZiB0aGUgQVBzIChmaXJzdCBkYXRhIHBvaW50IG9mIHRoZSB3YXZlZm9ybSkNCiAgKyAqKmNvZGVzOioqIG1hcmtlciBjb2RlcyBvZiB0aGUgQVBzDQogICsgKip2YWx1ZXM6KiogbWF0cml4IGNvbnRhaW5pbmcgdGhlIHdhdmVmb3JtcyBvZiB0aGUgQVBzIChkZXNjcmliZWQgYnkgYSBnaXZlbiBOby4gcG9pbnRzKQ0KIA0KKiBFRUcgY2hhbm5lbA0KICArICoqdGl0bGU6KiogY2hhbm5lbCBuYW1lDQogICsgKipjb21tZW50OioqDQogICsgKippbnRlcnZhbDoqKg0KICArICoqc2NhbGU6Kiogc2NhbGluZyBmYWN0b3IgKHkgc2NhbGUpLCByZWFsID0gKGRhdGEgKiBzY2FsZSkgKyBvZmZzZXQNCiAgKyAqKm9mZnNldDoqKiBzY2FsZSBvZmZzZXQNCiAgKyAqKnVuaXRzOioqDQogICsgKipzdGFydDoqKg0KICArICoqbGVuZ3RoOioqDQogICsgKip2YWx1ZXM6KioNCg0KYGBge3J9DQpmaWxlX3RvX2xvYWQgPC0gZmlsZV9saXN0W1sxXV0NCmZpbGVuYW1lIDwtIGFzLmNoYXJhY3RlcihzdWJzdHJpbmcoZmlsZV90b19sb2FkLCAxLCBuY2hhcihmaWxlX3RvX2xvYWQpIC0gNCkpDQpyYXcucmVjIDwtIHJlYWRNYXQoZmlsZS5wYXRoKCJkYXRhIiwgZmlsZV90b19sb2FkKSkNCg0KIyMjIHRha2VzIHRoZSBmaXJzdCBBUCAoZmlyc3Qgcm93KSBhbmQgdGVsbHMgdGhlIGluZGV4IG9mIHBvaW50IHdpdGggdGhlIG1heCB2YWx1ZQ0KcG9pbnRzX3RvX3BlYWsgPC0gd2hpY2gocmF3LnJlYyRhcFssICwgMV0kdmFsdWVzWzEsIF0gPT0NCiAgbWF4KHJhdy5yZWMkYXBbLCAsIDFdJHZhbHVlc1sxLCBdKSkgJT4lDQogIGFzLm51bWVyaWMoKQ0KDQojIyMgdGltZSBvZiB0aGUgcGVhayBvZiB0aGUgQVBzIGFmdGVyIGl0cyBmaXJzdCBwb2ludA0KcmF3LnJlYyRhcFssICwgMV0kaW50ZXJ2YWwgKiBwb2ludHNfdG9fcGVhaw0KDQphcCA8LSByYXcucmVjJGFwWywgLCAxXSR0aW1lcyAlPiUgYXMuZG91YmxlKCkNCmFwX3BlYWtzIDwtIHRpYmJsZShwZWFrX3RpbWVzID0gKGFwICsgYyhyYXcucmVjJGFwWywgLCAxXSRpbnRlcnZhbCAqIHBvaW50c190b19wZWFrKSkpDQpgYGANCg0KDQoNCkxvYWRpbmcgYWxsIGRhdGEgY2FsY3VsYXRlZCBieSAqKlN5bmNEZXN5bmNBbmFseXNpcyoqIGZ1bmN0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQphbGxfZWVnX2RmIDwtIHJlYWRSRFMoZmlsZSA9IGZpbGUucGF0aCgiZGF0YSIsICJzeW5jX2Rlc3luYyIsICJzeW5jX2Rlc3luY190aWJibGVzLnJkcyIpKQ0KRUVHX2RzX2RmIDwtIHB1cnJyOjpyZWR1Y2UoYWxsX2VlZ19kZiwgYmluZF9yb3dzKQ0KYGBgDQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBJU0kgdG8gZGV0ZXJtaW5lIGNsdXN0ZXJzDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0gMTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ19pc2lfcGVyaW9kcyA8LSBsYXBwbHkoYWxsX2VlZ19kZiwgZnVuY3Rpb24oeCkgew0KICBnZ3Bsb3QoDQogICAgZGF0YSA9IHggJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBBUCA9PSAxLA0KICAgICAgICAhaXMubmEoZWVnX3N0YXRlKSwNCiAgICAgICAgc3RhdGVfbGVuZ3RoID49IDEgLyBmaXJzdF9wZWFrICogMiwNCiAgICAgICAgaXNpID4gMCwgaXNpIDwgMSAvIGZpcnN0X3BlYWsNCiAgICAgICksICMjIyBOQXMgaW4gZWVnX3N0YXRlIGJlY2F1c2UgbW92aW5nX3NkIGhhcyBOQXMgYXQgdGhlIGVuZA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IGlzaSkNCiAgKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKA0KICAgICAgZmlsbCA9IGVlZ19zdGF0ZSwNCiAgICAgIGNvbG9yID0gZWVnX3N0YXRlDQogICAgKSwNCiAgICBhbHBoYSA9IC4zLA0KICAgIGJpbnMgPSB4JG5iaW5zICU+JSB1bmlxdWUoKQ0KICAgICkgKw0KICAgIGdlb21fdmxpbmUoDQogICAgICB4aW50ZXJjZXB0ID0geCRidXJzdF90aHJlc2hvbGRfaXNpICU+JSB1bmlxdWUoKQ0KICAgICkgKw0KICAgIGFubm90YXRlKA0KICAgICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgIHggPSB4JGJ1cnN0X3RocmVzaG9sZF9pc2kgJT4lIHVuaXF1ZSgpIC0geCRidXJzdF90aHJlc2hvbGRfaXNpICU+JSB1bmlxdWUoKSAvIDcsDQogICAgICB5ID0gSW5mLA0KICAgICAgbGFiZWwgPSBwYXN0ZTAoIkJ1cnN0IHRocmVzaG9sZCA9ICIsIHgkYnVyc3RfdGhyZXNob2xkX2lzaSAlPiUgdW5pcXVlKCkpLA0KICAgICAgYW5nbGUgPSA5MCwNCiAgICAgIGhqdXN0ID0gMS4yDQogICAgKSArDQogICAgbGFicyhjYXB0aW9uID0geCRJRCAlPiUgdW5pcXVlKCkpDQp9KQ0KDQoNCiMjIyBodHRwczovL2dpdGh1Yi5jb20va2Fzc2FtYmFyYS9nZ3B1YnIvaXNzdWVzLzE1OA0KIyMjIGJ1ZyEhISBoYWQgdG8gb3BlbiBhIE5VTEwgcGRmIGRldmljZQ0KcGRmKE5VTEwpDQpwX2lzaSA8LSBnZ3B1YnI6OmdnYXJyYW5nZShwbG90bGlzdCA9IGdnX2lzaV9wZXJpb2RzLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQp4IDwtIGRldi5vZmYoKQ0KDQpwX2lzaQ0KYGBgDQoNCiMjIyBMRlAgYW5kIEFQcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MjAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90dGluZ19yZWdpb24gPC0gYyg5MCwgMTUwKQ0KDQojIHBsb3R0aW5nX3JlZ2lvbiA8LSBjKGFsbF9lZWdfZGZbWzRdXSR0aW1lc1tsZW5ndGgoYWxsX2VlZ19kZltbNF1dJHRpbWVzKV0gLSA4MCwgYWxsX2VlZ19kZltbNF1dJHRpbWVzW2xlbmd0aChhbGxfZWVnX2RmW1s0XV0kdGltZXMpXSkNCg0KZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsNCiAgaHVlcyA8LSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpDQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dDQp9DQoNCmVlZ19zdW1fcGxvdCA8LSBsYXBwbHkoYWxsX2VlZ19kZiwgZnVuY3Rpb24oeCkgew0KICByZWN0X2luZGV4IDwtDQogICAgdGliYmxlKA0KICAgICAgc3RhdGVfc3RhcnQgPSBzdWJzZXQoeCwgc3RhdGVfbGVuZ3RoIDw9IDEgLyBmaXJzdF9wZWFrICogMikgJT4lDQogICAgICAgIGRwbHlyOjpzZWxlY3Qoc3RhdGVfc3RhcnQsIHN0YXRlX2VuZCkgJT4lIHB1bGwoc3RhdGVfc3RhcnQpICU+JSB1bmlxdWUoKSwNCiAgICAgIHN0YXRlX2VuZCA9IHN1YnNldCh4LCBzdGF0ZV9sZW5ndGggPD0gMSAvIGZpcnN0X3BlYWsgKiAyKSAlPiUNCiAgICAgICAgZHBseXI6OnNlbGVjdChzdGF0ZV9zdGFydCwgc3RhdGVfZW5kKSAlPiUgcHVsbChzdGF0ZV9lbmQpICU+JSB1bmlxdWUoKQ0KICAgICkNCg0KDQogIGdncGxvdCgNCiAgICBkYXRhID0gZHBseXI6OmZpbHRlcih4LCB0aW1lcyA+IHBsb3R0aW5nX3JlZ2lvblsxXSwgdGltZXMgPCBwbG90dGluZ19yZWdpb25bMl0pLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHRpbWVzLCB5ID0gZWVnX3ZhbHVlcykNCiAgKSArDQogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9ICJncmF5IikpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBtYXBwaW5nID0gYWVzKHggPSB0aW1lcywgeSA9IG1vdmluZ19zZCwgY29sb3IgPSBnZ19jb2xvcl9odWUoMilbMV0pLCBzaXplID0gMQ0KICAgICkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHRpbWVzLCB5ID0gbGV2ZWxzICsgMywgY29sb3IgPSBnZ19jb2xvcl9odWUoMilbMl0pLCBzaXplID0gMQ0KICAgICkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIG1hcHBpbmcgPSBhZXMoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgIHggPSBwbG90dGluZ19yZWdpb25bMV0gLSAyLCB4ZW5kID0gcGxvdHRpbmdfcmVnaW9uWzJdICsgMiwNCiAgICAgIHkgPSB4JHNkX3RocmVzaG9sZCAlPiUgdW5pcXVlKCksIHllbmQgPSB4JHNkX3RocmVzaG9sZCAlPiUgdW5pcXVlKCksDQogICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiDQogICAgKSArDQogICAgZ2VvbV9wb2ludCgNCiAgICAgIGRhdGEgPSAuICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShhcF9wZWFrX3RpbWVzKSksDQogICAgICBtYXBwaW5nID0gYWVzKHggPSBhcF9wZWFrX3RpbWVzLCB5ID0gNSksDQogICAgICBzaGFwZSA9ICJ8IiwNCiAgICAgIHNpemUgPSA0LA0KICAgICAgY29sb3IgPSAiZGFyayBncmF5Ig0KICAgICkgKw0KICAgIGdlb21fcG9pbnQoDQogICAgICBkYXRhID0gLiAlPiUgZHBseXI6OmZpbHRlcihidXJzdF9pc2kgPT0gMSksDQogICAgICBtYXBwaW5nID0gYWVzKHggPSB0aW1lcywgeSA9IGJ1cnN0X2lzaSArIDQpLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2hhcGUgPSAifCIsDQogICAgICBzaXplID0gNQ0KICAgICkgKw0KICAgIGdlb21fcmVjdCgNCiAgICAgIGRhdGEgPSBkcGx5cjo6ZmlsdGVyKHJlY3RfaW5kZXgsIHN0YXRlX3N0YXJ0ID4gcGxvdHRpbmdfcmVnaW9uWzFdLCBzdGF0ZV9zdGFydCA8IHBsb3R0aW5nX3JlZ2lvblsyXSksDQogICAgICBpbmhlcml0LmFlcyA9IEYsDQogICAgICBtYXBwaW5nID0gYWVzKHhtaW4gPSBzdGF0ZV9zdGFydCwgeG1heCA9IHN0YXRlX2VuZCwgeW1pbiA9IC1JbmYsIHltYXggPSArSW5mKSwgZmlsbCA9ICJwaW5rIiwgYWxwaGEgPSAwLjUNCiAgICApICsNCiAgICB5bGFiKCJFRUcgW2F1XSIpICsNCiAgICB4bGFiKCJUaW1lIikgKw0KDQogICAgIyMjIGNyZWF0aW5nIGxlZ2VuZA0KICAgIHNjYWxlX2NvbG9yX2lkZW50aXR5KA0KICAgICAgbmFtZSA9ICJMaW5lcyIsDQogICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gYyhyZXAoTkEsIDQpKSkpLA0KICAgICAgYnJlYWtzID0gYygiZ3JheSIsIGdnX2NvbG9yX2h1ZSgyKVsxXSwgZ2dfY29sb3JfaHVlKDIpWzJdLCAiYmxhY2siKSwNCiAgICAgIGxhYmVscyA9IGMoIkVFRyIsICJNb3ZpbmcgU0QiLCAiTGV2ZWxzIiwgIlNEIHRocmVzaG9sZCIpDQogICAgKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKGNhcHRpb24gPSB4JElEICU+JSB1bmlxdWUoKSkNCn0pDQoNCnBkZihOVUxMKQ0KcF9lZWcgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoDQogIHBsb3RsaXN0ID0gZWVnX3N1bV9wbG90LA0KICBjb21tb24ubGVnZW5kID0gVFJVRSwNCiAgbGVnZW5kID0gImJvdHRvbSIsIG5jb2wgPSAxDQopDQp4IDwtIGRldi5vZmYoKQ0KDQpwX2VlZw0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgY2x1c3RlcnMgaW4gc3luYyB2cyBkZXN5bmMgcGVyaW9kcw0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxlZnRfam9pbigNCiAgRUVHX2RzX2RmICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGVlZ19zdGF0ZSksIHN0YXRlX2xlbmd0aCA+PSAxIC8gZmlyc3RfcGVhayAqIDIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShJRCwgZWVnX3N0YXRlKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX2NsdXN0ZXJzID0gc3VtKGJ1cnN0X2lzaSwgbmEucm0gPSBUKSksDQogIEVFR19kc19kZiAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShlZWdfc3RhdGUpLCBzdGF0ZV9sZW5ndGggPj0gMSAvIGZpcnN0X3BlYWsgKiAyKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoSUQsIGVlZ19zdGF0ZSkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShzdGF0ZV9sZW5ndGhfc3VtID0gc3VtKHN0YXRlX2xlbmd0aCAlPiUgdW5pcXVlKCksIG5hLnJtID0gVCkpDQopICU+JQ0KICBkcGx5cjo6ZmlsdGVyKCFncmVwbChwYXR0ZXJuID0gIjAxfDA0IiwgSUQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZWVnX3N0YXRlLCB5ID0gTm9fY2x1c3RlcnMgLyBzdGF0ZV9sZW5ndGhfc3VtKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2wgPSBJRCksIHNpemUgPSAzKSArDQogIGdlb21fbGluZShhZXMoY29sID0gSUQsIGdyb3VwID0gSUQpKSArDQogIGdlb21fYm94cGxvdCgNCiAgICBhZXMoeCA9IGVlZ19zdGF0ZSwgeSA9IE5vX2NsdXN0ZXJzIC8gc3RhdGVfbGVuZ3RoX3N1bSksDQogICAgaW5oZXJpdC5hZXMgPSBGLA0KICAgIGFscGhhID0gMCwgd2lkdGggPSAwLjIsIGx3ZCA9IDEsIGZhdHRlbiA9IDEuMg0KICApICsNCiAgZ2VvbV9zaWduaWYoDQogICAgY29tcGFyaXNvbnMgPSBsaXN0KGMoImRlc3luYyIsICJzeW5jIikpLA0KICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgIHRlc3QgPSAid2lsY294LnRlc3QiLA0KICAgIG1hcmdpbl90b3AgPSAuMSwNCiAgICBjb2xvciA9ICJkYXJrZ3JheSINCiAgKSArDQogIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsIHBhaXJlZCA9IEYpDQoNCiMgZ2VvbV90ZXh0X3JlcGVsKA0KIyAgIGRhdGEgPSAuICU+JSBkcGx5cjo6ZmlsdGVyKGVlZ19zdGF0ZSA9PSAic3luYyIpLA0KIyAgIGFlcyhsYWJlbCA9IElEKSwNCiMgICBkaXJlY3Rpb24gPSAieSIsDQojICAgaGp1c3QgPSAtMSkNCmBgYA0KDQoNCg0KDQojIFRlcm1pbmFscw0KDQojIyBMb2FkaW5nIGRhdGENCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZmlsZV9wYXRoIDwtIGZpbGUucGF0aCgNCiAgImRhdGEiLA0KICAiRW1pX3Rlcm1pbmFscyIsDQogICJ0ZXJtaW5hbF9tZWFzdXJlcy5jc3YiDQopDQpURVJNSU5BTFMgPC0gcmVhZC50YWJsZShmaWxlID0gZmlsZV9wYXRoLCBzZXAgPSAiOyIsIGhlYWRlciA9IFQsIG5hLnN0cmluZyA9ICJuYSIpDQpoZWFkKFRFUk1JTkFMUykNCmBgYA0KDQojIyBCb3V0b24gYXJlYSBvbiBkaWZmZXJlbnQgZGVuZHJpdGljIGRvbWFpbnMNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBURVJNSU5BTFMsIG1hcHBpbmcgPSBhZXMoeCA9IHBvc3Rpb24sIHkgPSBiX2FyZWEpKSArDQogIGdlb21faGFsZl92aW9saW4oDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gLS4xNSksDQogICAgdHJpbSA9IEYsDQogICAgc2lkZSA9ICJsIiwNCiAgICBzY2FsZSA9ICJhcmVhIiwNCiAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KSwNCiAgICBhZXMoZmlsbCA9IHBvc3Rpb24pDQogICkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpKQ0KYGBgDQoNCiMjIEFyZWEgb2YgYm91dG9ucyB3aXRoICptMiogYW5kICp1bmtub3duKiBvcmlnaW4NCg0KYGBge3IgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gVEVSTUlOQUxTLA0KICBtYXBwaW5nID0gYWVzKHggPSBvcmlnaW4sIHkgPSBiX2FyZWEpDQopICsNCiAgZ2VvbV9oYWxmX3Zpb2xpbigNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAtLjE1KSwNCiAgICB0cmltID0gRiwNCiAgICBzaWRlID0gImwiLA0KICAgIHNjYWxlID0gImNvdW50IiwNCiAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KQ0KICAgICMgZmlsbCA9IGFscGhhKDAuMSksDQogICAgIyBhZXMoY29sID0gcG9zdGlvbikNCiAgKSArDQogIGdlb21faml0dGVyKA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMSksDQogICAgYWVzKGNvbCA9IHBvc3Rpb24pDQogICkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgeCA9IDAuNywNCiAgICB5ID0gMSwNCiAgICBsYWJlbCA9IHBhc3RlKA0KICAgICAgIm4gPSAiLA0KICAgICAgVEVSTUlOQUxTICU+JQ0KICAgICAgICBkcGx5cjo6Z3JvdXBfYnkob3JpZ2luKSAlPiUNCiAgICAgICAgZHBseXI6OnN1bW1hcmlzZShuID0gbGVuZ3RoKGJfYXJlYSkpICU+JQ0KICAgICAgICBkcGx5cjo6ZmlsdGVyKG9yaWdpbiA9PSAibTIiKSAlPiUNCiAgICAgICAgc2VsZWN0KG4pICU+JQ0KICAgICAgICBhcy5jaGFyYWN0ZXIoKQ0KICAgICkNCiAgKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICB4ID0gMS42LA0KICAgIHkgPSAxLA0KICAgIGxhYmVsID0gcGFzdGUoDQogICAgICAibiA9ICIsDQogICAgICBURVJNSU5BTFMgJT4lDQogICAgICAgIGRwbHlyOjpncm91cF9ieShvcmlnaW4pICU+JQ0KICAgICAgICBkcGx5cjo6c3VtbWFyaXNlKG4gPSBsZW5ndGgoYl9hcmVhKSkgJT4lDQogICAgICAgIGRwbHlyOjpmaWx0ZXIob3JpZ2luID09ICJ1bmtub3duIikgJT4lDQogICAgICAgIHNlbGVjdChuKSAlPiUNCiAgICAgICAgYXMuY2hhcmFjdGVyKCkNCiAgICApDQogICkNCmBgYA0K
>>>>>>> remotes/origin/desync_analysis_all_files =======
LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIsIEVtaWxpYSBCb3N6LCBMYXN6bG8gQWNzYWR5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB0cnVlDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQpzcGFjaW5nOiBzaW5nbGUNCmZvbnRzaXplOiAxMnB0DQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KDQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC1mYW1pbHk6ICJBcmlhbCIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzRkNGU0ZjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgzIHsgLyogSGVhZGVyIDMgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShSLm1hdGxhYikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoc3R5bGVyKQ0KbGlicmFyeShmb3JtYXRSKQ0KDQpsaWJyYXJ5KGJzcGVjKSAjIyMgcG93ZXIgc3BlY3RydW0NCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KGRpcHRlc3QpICMjIyB0byB0ZXN0IGRpc3RyaWJ1dGlvbiB1bmkvbXVsdGltb2RhbGl0eSAoSVNJKQ0KbGlicmFyeShleGFjdFJhbmtUZXN0cykgIyMjIHdpbGNveC50ZXN0IGZvciB0aWVzDQpsaWJyYXJ5KFdhdmVsZXRDb21wKSAjIyMgd2F2ZWxldA0KbGlicmFyeShzaWduYWwpDQoNCmxpYnJhcnkoU1RBUikNCmxpYnJhcnkoc2VlKSAjIGZvciBoYWxmIHZpb2xpbnBsb3QNCmxpYnJhcnkoZ2doYWx2ZXMpICMgZm9yIGhhbGYgdmlvbGlucGxvdA0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IFRSVUUsIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmID0gMzApKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KDQoNCiMgRmlyaW5nIHJhdGUgb2YgSUwgbmV1cm9ucyBkdXJpbmcgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbg0KDQpJbiB0aGVzZSBleHBlcmltZW50cyBnbHljaW5lcmdpYyBmaWJlcnMgd2VyZSBwaG90YWN0aXZhdGVkIHdoaWxlIHRoZSBmaXJpbmcgcmF0ZSBvZiBpbmRpdmlkdWFsIElMIG5ldXJvbnMgd2FzIHJlY29yZGVkLiBTb21lIG9mIHRoZSBJTCBjZWxscyBoYWQgdmVyeSBsb3cgYmFzZWxpbmUgYWN0aXZpdHkuIEluIG9yZGVyIHRvIGluY3JlYXNlIHRoZSBmaXJpbmcgcmF0ZSBvZiB0aGUgSUwgbmV1cm9ucyBhbmQgdG8gZGV0ZWN0IHRoZSBlZmZlY3Qgb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24gYSBzbWFsbCB0YWlsIHBpbmNoIHdhcyBhcHBsaWVkLiBUaGUgZmlyaW5nIHJhdGUgb2YgdGhlIHJlY29yZGVkIElMIGNlbGxzIGRlY3JlYXNlZCBkdXJpbmcgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24uIA0KDQoNCiMjIExvYWRpbmcgZGF0YQ0KDQoNCkxvYWRpbmcgQVAgYW5kIHN0aW11bGkgdGltZXMgZnJvbSAqc3RpbXVsdXMqIGFuZCBmcm9tICpiYXNlbGluZSogZGF0YSB0byAqKklMX3N0aW1fZmlyaW5nKiogYW5kIHRvICoqSUxfYmFzZWxpbmVfZmlyaW5nKiogdGFibGVzOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KSUxfc3RpbV9maXJpbmcgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiQVBfdGltZXMuY3N2IikpLA0KICBzdGltX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJzdGltdWx1cyIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KSUxfc3RpbV9maXJpbmcgJT4lIGhlYWQoKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KSUxfYmFzZWxpbmVfZmlyaW5nIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgIkFQX3RpbWVzLmNzdiIpKSwNCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAiYmFzZWxpbmUiLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyBTdW1tYXJ5IGluZm9ybWF0aW9uIA0KDQpTdW1tYXJ5IGluZm9ybWF0aW9uIG9mIHRoZSAqc3RpbXVsdXMqIGFuZCAgKmJhc2VsaW5lKiByZWNvcmRpbmcgZmlsZXM6DQoNCiogVmFyaWFibGVzOg0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmF3IHJlY29yZGluZyBmaWxlcyAoKk5vX2NoKikNCiAgKyBudW1iZXIgb2YgQVBzICgqTm9fQVBfdW5pdCosICpOb19BUF91bml0MiopDQogICsgbnVtYmVyIG9mIHN0aW11bHVzIHRyYWlucyAoKk5vX1N0aW0qKQ0KICArIExGUCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX2xmcCopDQogICsgdW5pdCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX3VuaXQqKQ0KICArIGxlbmd0aCBvZiB0aGUgcmVjb3JkaW5nICgqcmVjX2xlbmd0aCopDQogICsgbGVuZ3RoIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpOb190cmFpbnMqKQ0KICArIEFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zIGVxdWFsIGluIHRoZSByZWNvcmRpbmcgKCp0cmFpbl9sZW5ndGhfZXF1YWwqKQ0KICArIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKnRyYWluX3N0YXJ0KikNCiAgKyBlbmRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fZW5kKikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSB9DQoNCmluZm9fc3RpbSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgInN0aW11bHVzIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX3N0aW0sDQogIGNhcHRpb24gPSAiU3VtbWFyeSB0YWJsZSBvZiB0aGUgc3RpbXVsdXMgcmVjb3JkaW5nIGZpbGVzIChpbmZvX3N0aW0pIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCjxicj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaW5mb19iYXNlbGluZSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX2Jhc2VsaW5lLA0KICBjYXB0aW9uID0gIlN1bW1hcnkgdGFibGUgb2YgdGhlIGJhc2VsaW5lIHJlY29yZGluZyBmaWxlcyAoaW5mb19iYXNlbGluZSkiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj4NCg0KKipDRUxMX0lORk8qKiB0YWJsZSB0byBzdG9yZSB0aGUgY2VsbCBjYXRlZ29yaWVzLiBJdCB3YXMgY3JlYXRlZCBtYW51YWxseSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3VtbWFyeSBleGNlbCB0YWJsZSAoKkdsaWN5X2p1eHRhLWZtX2V4cF9yZWNvcmRzX2luamVjdGlvbl9zdW0ueGxzKikNCg0KKiBWYXJpYWJsZXMNCiAgKyBjZWxsIGlkZW50aWZpY2F0aW9uICgqY2VsbF9pZCopLiBUbyBmaW5kIHRoZSByZWNvcmRpbmcgZmlsZSB1c2UgdGhlIHN1bW1hcnkgZXhjZWwgdGFibGUNCiAgKyBmaWxlIG5hbWVzICgqZmlsZV9uYW1lKikNCiAgKyBzcG9udGFuZW91c2x5IGFjdGl2ZSBjZWxscyAoKmJsX2FjdGl2aXR5KikNCiAgKyBpbmR1Y2VkIGZpcmluZyAoKnBpbmNoKikNCiAgKyBpbmRpdmlkdWFsbHkgaWRlbnRpZmllZCBuZXVyb25zICgqaWRlbnQqKQ0KICArIGNvbnRyb2wgY2VsbHMgKCpjb250cm9sKikNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIyBDRUxMIElORk8gdG8gc3RvcmUgY2F0ZWdvcmllcyAoc3BvbnRhbmVvdXNseSBhY3RpdmUsIGluZHVjZWQgZmlyaW5nLCBpZGVudGlmaWVkKQ0KQ0VMTF9JTkZPIDwtIGluZm9fYmFzZWxpbmUgJT4lDQogIHNlbGVjdChmaWxlX25hbWUpICU+JQ0KICBhZGRfY29sdW1uKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19iYXNlbGluZSRmaWxlX25hbWUsIDEsIDYpLCAuYmVmb3JlID0gImZpbGVfbmFtZSIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGJsX2FjdGl2aXR5ID0gVCkgJT4lDQogIGRwbHlyOjptdXRhdGUoYmxfYWN0aXZpdHkgPSByZXBsYWNlKA0KICAgIGJsX2FjdGl2aXR5LA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIsDQogICAgRg0KICApKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwaW5jaCA9IFQpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBpbmNoID0gcmVwbGFjZSgNCiAgICBwaW5jaCwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE5IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoaWRlbnQgPSBUKSAlPiUNCiAgZHBseXI6Om11dGF0ZShpZGVudCA9IHJlcGxhY2UoDQogICAgaWRlbnQsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjciLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY29udHJvbCA9IEYpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNvbnRyb2wgPSByZXBsYWNlKA0KICAgIGNvbnRyb2wsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI5IiwNCiAgICBUDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gInVua25vd24iKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDExIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiLA0KICAgICJJTCINCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUocG9zaXRpb24gPSByZXBsYWNlKA0KICAgIHBvc2l0aW9uLA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjIiLA0KICAgICJ0cmFuc2llbnQiDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gcmVwbGFjZSgNCiAgICBwb3NpdGlvbiwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgICJQRiINCiAgKSkNCg0KZGF0YXRhYmxlKENFTExfSU5GTywNCiAgY2FwdGlvbiA9ICJDRUxMX0lORk8gdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQoNCiMgSUxfc3RpbV9maXJpbmckZmlsZV9uYW1lICU+JSB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkNCiMgaW5mb19zdGltJGZpbGVfbmFtZSAlPiUgbGVuZ3RoKCkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIENhbGN1bGF0aW9ucw0KIyMjIEZpcmluZyByYXRlcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMjIyBDQUxDVUxBVElORyAtLS0tLS0tLQ0KDQpJTF9zdGltX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfc3RpbV9maXJpbmcsDQogIGluZm9fc3RpbSAlPiUNCiAgICBzZWxlY3QoDQogICAgICBmaWxlX25hbWUsDQogICAgICByZWNfbGVuZ3RoLA0KICAgICAgdHJhaW5fc3RhcnRzLA0KICAgICAgdHJhaW5fZW5kcywNCiAgICAgIHRyYWluX2xlbmd0aA0KICAgICksDQogIGJ5ID0gImZpbGVfbmFtZSINCikNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW0gc3RhcnQgdGltZXMNCnN0YXJ0X3RpbWVzIDwtIElMX3N0aW1fZmlyaW5nICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZmlsZV9uYW1lKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY2VsbF9pZCA9IHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjpncm91cF9ieShjZWxsX2lkKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSkgJT4lDQogIHB1bGwodHJhaW5fc3RhcnRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbSBlbmQgdGltZXMNCmVuZF90aW1lcyA8LSBJTF9zdGltX2ZpcmluZyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fc3RhcnRzID0gdW5pcXVlKHRyYWluX3N0YXJ0cyksIHRyYWluX2VuZHMgPSB1bmlxdWUodHJhaW5fZW5kcykpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIHB1bGwodHJhaW5fZW5kcykgJT4lDQogIHN0cnNwbGl0KCIsIikgJT4lDQogIHNldF9uYW1lcyhzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBsYXBwbHkoYXMubnVtZXJpYykNCg0KDQpjZWxsX2xpc3QgPC0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpDQpDRUxMX0lORk8kY2VsbF9pZA0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIEFQIGIvZC9hIHN0aW0uIEFyZ3VtZW50czogZGF0YSAoSUxfc3RpbV9maXJpbmcgdGFibGUgd2l0aCByZWNfbGVuZ3RoIGFuZCBzdGltdWx1cyB0cmFpbiBpbmZvcm1hdGlvbikNCkJEQUNhbGN1bGF0b3IgPC0gZnVuY3Rpb24oZGF0YSwgbGlzdCkgew0KICBjZWxsX2xpc3QgPC0gbGlzdA0KDQogIHRyYWluX2xlbmd0aCA8LSBkYXRhICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0KSAlPiUNCiAgICBzZWxlY3QodHJhaW5fbGVuZ3RoKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgYFtbYCgxKQ0KDQoNCg0KICBpZiAoDQogICAgKGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3QodW5pdF9pZCkgJT4lDQogICAgICB1bmlxdWUoKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGxlbmd0aCgpKSA9PSAxDQogICkgew0KICAgICMjIyBJbiBjYXNlIG9mIG9uZSB1bml0IGluIHRoZSBmaWxlOg0KICAgIEFQX3RpbWVzIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpDQoNCiAgICBBUF9udW1iZXJzIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnMpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgIDwgQVBfdGltZXMgJiBBUF90aW1lcyA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgQVBfdGltZXMgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNbQVBfdGltZXMgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQogICAgbWVsdChBUF9udW1iZXJzLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgIGFkZF9jb2x1bW4oY2VsbF9pZCA9IGNlbGxfbGlzdCkgJT4lDQogICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgfSBlbHNlIHsNCiAgICAjIyMgaW4gY2FzZSBvZiBtdWx0aXBsZSB1bml0cyBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lc18xIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAxKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMSA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzEpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMVt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18xW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzEgJiBBUF90aW1lc18xIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18xIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMSA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCiAgICBBUF90aW1lc18yIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAyKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMiA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzIpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18yW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzIgJiBBUF90aW1lc18yIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18yIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCg0KICAgIGlmIChjZWxsX2xpc3QgJT4lIHN1YnN0cig1LCA2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDEpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwwIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSAlPiUgbmNoYXIoKSA9PSAyKSB7DQogICAgICBuZXdfbmFtZSA8LSBwYXN0ZTAoDQogICAgICAgICJjZWxsIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBiaW5kX3Jvd3MoDQogICAgICBtZWx0KEFQX251bWJlcnNfMSwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gY2VsbF9saXN0KSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpLA0KDQogICAgICBtZWx0KEFQX251bWJlcnNfMiwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gbmV3X25hbWUpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgICApDQogIH0gIyBlbHNlDQp9ICMgZm9vDQpgYGANCg0KKipiX2RfYV9NRlIqKjogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBBUHMgLXVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpCREFDYWxjdWxhdG9yKiktIGJlZm9yZSBkdXJpbmcgYW5kIGFmdGVyIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpiX2RfYV9NRlIqKS4gDQoNCmBgYHtyfQ0KYl9kX2FfTUZSIDwtIGxhcHBseShDRUxMX0lORk8kY2VsbF9pZCwgQkRBQ2FsY3VsYXRvciwgZGF0YSA9IElMX3N0aW1fZmlyaW5nKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGRwbHlyOjptdXRhdGUoRlIgPSBOb19BUCAvIHRyYWluX2xlbmd0aCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShzdGltX2NvbmQsIGNlbGxfaWQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKE1GUiA9IG1lYW4oRlIpKQ0KYGBgDQoNCjxicj4NCioqc2RfbWVhbl9pc2kqKjogQ2FsY3VsYXRpbmcgdGhlIGJhc2VsaW5lIE1GUiBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZnJvbSB0aGUgKklMX2Jhc2VsaW5lX2ZpcmluZyogdGFibGUgdXNpbmcgYSBjdXN0b20gbWFkZSBmdW5jdGlvbiAoKlNETWVhbklTSSopLiBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHRoZSAqc2RfbWVhbl9pc2kqIHRhYmxlLg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCklMX2Jhc2VsaW5lX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfYmFzZWxpbmVfZmlyaW5nLA0KICBpbmZvX2Jhc2VsaW5lICU+JQ0KICAgIHNlbGVjdChmaWxlX25hbWUsIHJlY19sZW5ndGgpLA0KICBieSA9ICJmaWxlX25hbWUiDQopICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fY29uZCA9ICJiYXNlbGluZSIpDQoNCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgSVNJIG1lYW4gYW5kIFNEIGR1cmluZyBiYXNlbGluZSBhY3Rpdml0eSBvZiB0aGUgY2VsbHMNClNETWVhbklTSSA8LSBmdW5jdGlvbihmX25hbWUpIHsNCg0KDQogICMgbWVhbl9pc2kgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAjICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgIyAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICMgICBwdWxsKCkgJT4lDQogICMgICBkaWZmKCkgJT4lDQogICMgICBtZWFuKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHNkX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIHNkKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHJldHVybihsaXN0KE1GUiA9IG1lYW5faXNpLA0KICAjICAgICAgICAgICAgIFNERlIgPSBzZF9pc2kpKQ0KDQogIHRtcDIgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgZGlmZigpICU+JQ0KICAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICAgICB0aWJibGUobWVhbl9pc2kgPSAuKQ0KICB0bXAyICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc2RfaXNpID0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBkaWZmKCkgJT4lDQogICAgICBzZCgpICogMTAwMCkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmaWxlX25hbWUgPSBmX25hbWUpDQp9DQoNCnNkX21lYW5faXNpIDwtIGxhcHBseShpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgU0RNZWFuSVNJKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFzLnRpYmJsZSgpDQoNCnNkX21lYW5faXNpIDwtIHNkX21lYW5faXNpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoc2RfbWVhbl9pc2kkZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSID0gMTAwMCAvIG1lYW5faXNpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShTRF9GUiA9IDEwMDAgLyBzZF9pc2kpICU+JQ0KICBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSBNRlIgKyBTRF9GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSX2RlYyA9IE1GUiAtIFNEX0ZSKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSAxMDAwLyhtZWFuX2lzaS1zZF9pc2kpKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9kZWMgPSAxMDAwLyhtZWFuX2lzaStzZF9pc2kpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2NvbmQgPSAiYmFzZWxpbmUiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShNRlJfZGVjID0gcmVwbGFjZShNRlJfZGVjLCBzZF9tZWFuX2lzaSRNRlJfZGVjIDwgMCwgMCkpDQpgYGANCjxicj4NCg0KIyMjIFJhbmtzIChzdHJlbmd0aCBvZiBpbmhpYml0aW9uKQ0KKipjZWxscmFua3MqKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiYXNlbGluZToNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmFzZVxfTUZSfXtiYXNlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KYGBge3J9DQpjZWxscmFua3MgPC0gYl9kX2FfTUZSICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9jb25kKSAlPiUNCiAgZHBseXI6Om11dGF0ZShiYXNlX01GUiA9IHNkX21lYW5faXNpJE1GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoYWN0aXZpdHlfY2hhbmdlID0gKChNRlIgLSBiYXNlX01GUikgLyBiYXNlX01GUiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihzdGltX2NvbmQgPT0gImQiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JQ0KICAgIHNlbGVjdChjZWxsX2lkLCBjb250cm9sLCBwaW5jaCwgcG9zaXRpb24pLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQpjZWxscmFua3MNCmBgYA0KDQoNCg0KKipjZWxscmFua3NfYmVmb3JlX3N0aW0qKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmVmb3JlIHN0aW11bHVzKiIgdG8gIipkdXJpbmcgc3RpbXVsdXMqIi4gSWYgdGhlIGFjdGl2aXR5IGNoYW5nZSBpcyBuZWdhdGl2ZSAoZGVjcmVhc2VkIE1GUikgdGhlIGFzaWduZWQgcmFuayBpcyBuZWdhdGl2ZSwgaWYgaXQgaXMgcG9zaXRpdmUgKGluY3JlYXNlZCBNRlIpIHRoZSBhc3NpZ25lZCByYW5rIGlzIHBvc2l0aXZlLg0KDQo8YnI+DQoNCkNhbGN1bGF0aW5nIHRoZSBmaXJpbmcgcmF0ZSBjaGFuZ2UgZHVyaW5nIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gYmVmb3JlIHN0aW11bHVzOg0KDQo8YnI+PGJyPjxicj4NCg0KJCRcbWF0aGJme2FjdGl2aXR5XF9jaGFuZ2V9ID0gXGZyYWN7ZHVyaW5nXF9NRlIgLSBiZWZvcmVcX01GUn17YmVmb3JlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KDQoNCmBgYHtyfQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltIDwtIGJfZF9hX01GUiAlPiUNCiAgc3ByZWFkKGtleSA9IHN0aW1fY29uZCwgdmFsdWUgPSBNRlIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGFjdGl2aXR5X2NoYW5nZSA9ICgoZCAtIGIpIC8gYiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoY2VsbF9pZCwgY29udHJvbCwgcGluY2gsIHBvc2l0aW9uKSwNCiAgYnkgPSAiY2VsbF9pZCINCiAgKQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCiMjIyBEYXRhIHRvIHBsb3QNCioqVE9fUExPVCoqOiBDb21iaW5pbmcgKmJfZF9hX01GUiogKGZpcmluZyByYXRlIG9mIDI5IElMIG5ldXJvbnMgYi9kL2Egc3RpbSkgd2l0aCAqc2RfbWVhbl9pc2kqIHRhYmxlIChiYXNlbGluZSBmaXJpbmcgcmF0ZSBvZiB0aGUgc2FtZSAyOSBuZXVyb25zKSwgam9pbmluZyB3aXRoIENFTExfSU5GTyBjb250YWluaW5nIGltcG9ydGFudCBpbmZvcm1hdGlvbiBvZiB0aGUgY2VsbHMgKGJhc2VsaW5lIGFjdGl2aXR5LCBpZGVudGlmaWVkLCBwaW5jaGVkLCBjb250cm9sKSBhbmQgd2l0aCAqY2VsbHJhbmtzKiBjb250YWluaW5nIHRoZSByYW5rcyBhc2lnbmVkIHRvIGVhY2ggY2VsbHMgYmFzZWQgb24gdGhlIGNoYW5nZXMgaW4gTUZSIGR1cmluZyB0aGUgc3RpbXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVE9fUExPVCA8LSBiaW5kX3Jvd3MoDQogIHNkX21lYW5faXNpICU+JQ0KICAgIHNlbGVjdChNRlIsIGNlbGxfaWQsIHN0aW1fY29uZCksDQogIGJfZF9hX01GUg0KKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoLWZpbGVfbmFtZSksDQogIGJ5ID0gImNlbGxfaWQiDQogICkgJT4lDQogIGxlZnRfam9pbihjZWxscmFua3MgJT4lDQogICAgc2VsZWN0KGNlbGxfaWQsIGNoYW5nZV9yYW5rLCBhY3Rpdml0eV9jaGFuZ2UpLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQoNCmRhdGF0YWJsZShUT19QTE9ULA0KICBjYXB0aW9uID0gIlRPX1BMT1QgdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj48YnI+DQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBCYXNlbGluZSB2cy4gImJlZm9yZSIgc3RpbXVsdXMgYWN0aXZpdHkNCg0KQ29tcGFyaXNvbiBvZiBiYXNlbGluZSBhbmQgImJlZm9yZSIgc3RpbXVsdXMgZmlyaW5nIHJhdGVzIGluIHRoZSBjYXNlIG9mIHNwb250YW5lb3VzbHkgYWN0aXZlIGFuZCBzcG9udGVuZW91c2x5IGluYWN0aXZlIChwaW5jaCkgbmV1cm9ucy4gU3BvbnRhbmVvdXNseSBpbmFjdGl2ZSBuZXVyb25zIHNob3dlZCBzaWduaWZpY2FudGx5IGhpZ2hlciBNRlIgYmVmb3JlIHN0aXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJiIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImIiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwaW5jaCksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gcGluY2gpDQogICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIHRoZW1lKA0KICAjICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICMgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgIyApICsNCiAgeGxhYigiUmVjb3JkaW5nIHBlcmlvZCIpICsNCiAgZmFjZXRfd3JhcCh2YXJzKHBpbmNoKSkgKw0KICBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLCBwYWlyZWQgPSBUKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBudWRnZV94ID0gLS45LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICAjIGhqdXN0ID0gMiwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIE1GUiBiZWZvcmUsIGR1cmluZyBhbmQgYWZ0ZXIgc3RpbXVsdXMgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAgLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImIiIHwgc3RpbV9jb25kID09ICJkIiB8IHN0aW1fY29uZCA9PSAiYSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IDApKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICMgdGhlbWUoDQogICMgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgIyAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICAjICkgKw0KICBnZ3RpdGxlKCJQaW5jaCIsICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICB5bGltKDAsIDM1KSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLA0KICAgIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCksDQogICAgY29sb3IgPSAiI0VCODEwNCINCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIG51ZGdlX3ggPSAwLjE1LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0wLjUsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpDQpgYGANCjxicj48YnI+DQoNCiMjIyBTdHJlbmd0aCBvZiBpbmhpYml0aW9uDQoNCkZpcmluZyByYXRlIGNoYW5nZSAqKmR1cmluZyoqIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gKipiYXNlbGluZSoqOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBjZWxscmFua3MsDQogIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKQ0KKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gRiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKA0KICAgIGRhdGEgPSBjZWxscmFua3MgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICkgKw0KDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIHRoZW1lKA0KICAjICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICMgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgIyApICsNCiAgeWxpbSgtbWF4KGNlbGxyYW5rcyRhY3Rpdml0eV9jaGFuZ2UpLCBtYXgoY2VsbHJhbmtzJGFjdGl2aXR5X2NoYW5nZSkpDQpgYGANCg0KPGJyPjxicj4NCg0KRmlyaW5nIHJhdGUgY2hhbmdlICoqZHVyaW5nKiogc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byAqKmJlZm9yZSoqIHN0aW11bHVzOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmdncGxvdCgNCiAgZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gY2hhbmdlX3JhbmssIHkgPSBhY3Rpdml0eV9jaGFuZ2UpDQopICsNCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IEYpLCBzaXplID0gNiwNCiAgICBhZXMoDQogICAgICBjb2wgPSBwb3NpdGlvbiwNCiAgICAgIHNoYXBlID0gcGluY2gNCiAgICApDQogICkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiSUwiID0gImdyZWVuIiwgInRyYW5zaWVudCIgPSAiYmx1ZSIsICJQRiIgPSAicmVkIiwgInVua25vd24iID0gImJsYWNrIiwgImNvbnRyb2wiID0gIm1hZ2VudGEiKSkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAiKyIsICJGQUxTRSIgPSAiLSIpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKA0KICAgIGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICkgKw0KDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAjIHRoZW1lKA0KICAjICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICMgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgIyApICsNCiAgeGxhYigiUmFua3MiKSArDQogIHlsYWIoIkNoYW5nZSBpbiBmaXJpbmcgcmF0ZSBbJV0iKSArDQogIHlsaW0oLW1heChjZWxscmFua3NfYmVmb3JlX3N0aW0kYWN0aXZpdHlfY2hhbmdlKSwgbWF4KGNlbGxyYW5rc19iZWZvcmVfc3RpbSRhY3Rpdml0eV9jaGFuZ2UpKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo8YnI+PGJyPg0KDQpQbG90dGluZyB0aGUgY2hhbmdlIGluIE1GUiBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBDb2xvcmluZyBiYXNlZCBvbiB0aGUgc3RyZW5ndGggb2YgdGhlIGluaGliaXRpb24gKCpyYW5rKikNCg0KYGBge3IsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJkIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IGNoYW5nZV9yYW5rKSwNCiAgICBzaGFwZSA9IDIxLA0KICAgICMgZmlsbCA9ICIjRUI4MTA0IiwNCiAgICAjIGNvbG9yID0gIndoaXRlIiwNCiAgICBzaXplID0gNA0KICApICsNCiAgIyBzdHJva2UgPSAyKSArDQogIGdlb21fbGluZSgNCiAgICBhZXMoZ3JvdXAgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuaykNCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuayksDQogICAgIyBudWRnZV94ID0gLS4xLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IDQsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogICMgdGhlbWUoDQogICMgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgIyAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICAjICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICBsYWJzKGZpbGwgPSAiUmFuayIsIGNvbCA9ICJSYW5rIikNCmBgYA0KDQoNCjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPg0KDQoNCiMgQWN0aXZpdHkgb2YgUFJGIGdseWNpbmVyZ2ljIGNlbGxzIGR1cmluZyBQRkMgcGhvdG9hY3RpdmF0aW9uDQoNCiMjIExvYWRpbmcgYW5kIHRyYW5zZm9ybWluZyAoaGlkZGVuIGNvZGUpIGRhdGENCg0KDQpgYGB7ciBsb2FkaW5nIGRhdGEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KUkVDT1JESU5HUyA8LSBDcmVhdGVSZWNUaWJibGUoDQogIEFQX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgImNvcnRpY2FsX3N0aW0iLCAiQVBfdGltZXMuY3N2IikpLA0KICBzdGltX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgImNvcnRpY2FsX3N0aW0iLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCg0KDQojIyMgQ0FSRUZVTCBXSVRIIFRISVMhISBJdCdzIGdlbmVyYXRlZCBieSB0aGUgIkNyZWF0ZVBTVEhUaWJibGUiIGZ1bmN0aW9uIGJ1dCB0aGUgZnJlcXVlbmNpZXMgaGF2ZSB0byBiZSBjaGFuZ2VkIG1hbnVhbGx5LCBhbmQgaXQgY2FuIGNyZWF0ZSBkdXBsaWNhdGVzISBJIGhhdmUgdG8gd29yayBvbiB0aGF0IQ0KU1RJTV9SRVNVTFRTIDwtIHJlYWRfY3N2KGZpbGUucGF0aCgib3V0cHV0X2RhdGEiLCAiY29ydGljYWxfc3RpbV9hbmFseXNpcy5jc3YiKSkNCmBgYA0KDQoNCmBgYHtyIHRyYW5zZm9ybWluZyBkYXRhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIGFkZGluZyBzdGltdWx1cyBudW1iZXIgd2l0aGluIHRyYWluDQpSRUNPUkRJTkdTIDwtIFJFQ09SRElOR1MgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9udW1iZXIgPSAwKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbXVsdXMgbnVtYmVyIHdpdGhpbiB0cmFpbg0KaW5pdGlhbF92YWx1ZSA8LSBSRUNPUkRJTkdTJHN0aW1fZnJlcVsxXSAlPiUNCiAgYGNvbW1lbnQ8LWAoIkZpcnN0IHZhbHVlIG9mIHN0aW1fZnJlcSB2YXJpYWJsZS4gV2hlbiBpdCBjaGFuZ2VzIHN0aW11bHVzIGNvdW50aW5nIHJlc3RhcnRzIikNCg0Kc3RpbV9jb3VudGVyIDwtIDEgJT4lDQogIGBjb21tZW50PC1gKCJDb3VudHMgc3RpbXVsaSBpbiBhIHRyYWluIikNCmluZGV4IDwtIDEgJT4lDQogIGBjb21tZW50PC1gKCJUcmFja3MgdGhlIHBvc2l0aW9uIChpbmRleCkgb2Ygc3RpbV9mcmVxIikNCg0KUkVDT1JESU5HUyRzdGltX251bWJlclsxXSA8LSBzdGltX2NvdW50ZXINCnJlcGVhdHsNCiAgaWYgKFJFQ09SRElOR1Mkc3RpbV9mcmVxW2luZGV4ICsgMV0gPT0gaW5pdGlhbF92YWx1ZSkgew0KICAgIFJFQ09SRElOR1Mkc3RpbV9udW1iZXJbaW5kZXggKyAxXSA8LSBzdGltX2NvdW50ZXIgKyAxDQogICAgc3RpbV9jb3VudGVyIDwtIHN0aW1fY291bnRlciArIDENCiAgICBpbmRleCA8LSBpbmRleCArIDENCiAgfSBlbHNlIHsNCiAgICBpbml0aWFsX3ZhbHVlIDwtIFJFQ09SRElOR1Mkc3RpbV9mcmVxW2luZGV4ICsgMV0NCiAgICBzdGltX2NvdW50ZXIgPC0gMQ0KICAgIFJFQ09SRElOR1Mkc3RpbV9udW1iZXJbaW5kZXggKyAxXSA8LSBzdGltX2NvdW50ZXINCiAgICBpbmRleCA8LSBpbmRleCArIDENCiAgfQ0KDQogIGlmIChpbmRleCA9PSBsZW5ndGgoUkVDT1JESU5HUyRzdGltX251bWJlcikpIHsNCiAgICBicmVhaw0KICB9DQp9DQoNCiMjIyByZXBsYWNpbmcgc3RpbV9udW1iZXIgd2l0aCBOQSBhdCAiQVAiDQpSRUNPUkRJTkdTJHN0aW1fbnVtYmVyW1JFQ09SRElOR1Mkc2lnbmFsX3R5cGUgPT0gIkFQIl0gPC0gTkENCg0KIyMjIGNhdGVnb3JpemluZyBzdGltdWxpDQpSRUNPUkRJTkdTIDwtIFJFQ09SRElOR1MgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gc3RpbV9mcmVxKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXFfY2F0ZWcgPSByZXBsYWNlKA0KICAgIHggPSBzdGltX2ZyZXFfY2F0ZWcsDQogICAgbGlzdCA9IChzdGltX2ZyZXFfY2F0ZWcgPT0gMTIgfCBzdGltX2ZyZXFfY2F0ZWcgPT0gOCksDQogICAgdmFsdWVzID0gMTANCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gcmVwbGFjZSgNCiAgICB4ID0gc3RpbV9mcmVxX2NhdGVnLA0KICAgIGxpc3QgPSAoc3RpbV9mcmVxX2NhdGVnID09IDE4KSwNCiAgICB2YWx1ZXMgPSAyMA0KICApKQ0KYGBgDQoNCmBgYHtyIGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJIaXN0U3RhdHMuUiIpKQ0KDQpTVElNX1JFU1VMVFMgJT4lDQogIGRwbHlyOjpncm91cF9ieShmcmVxKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShuX3RpbWVzID0gbGVuZ3RoKHVuaXF1ZShhbmltYWxfaWQpKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgYXMubWF0cml4KCkgJT4lDQogIHVubmFtZSgpIC0+IHJlcF9tYXRyaXgNCg0KIyMjIHNldCBQU1RIIHJhbmdlDQpQU1RIX3JhbmdlIDwtIGMoLTAuMDEsIDAuMDQpDQoNCg0KaGlzdF9zdGF0cyA8LSBTVElNX1JFU1VMVFMgJT4lDQogIGRwbHlyOjpmaWx0ZXIoDQogICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXQ0KICApICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZnJlcSkgJT4lDQogIGRvKGdwX2hpc3QgPSBnZ3Bsb3QoDQogICAgZGF0YSA9IC4sDQogICAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQogICkgKw0KICAgIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gYW5pbWFsX2lkKSwgYmlud2lkdGggPSAwLjAwMSkgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICAgIG5hbWUgPSAiQW5pbWFsIg0KICAgICAgIyBndWlkZSA9IEZBTFNFDQogICAgKSArDQogICAgZmFjZXRfd3JhcCh+YW5pbWFsX2lkLCBuY29sID0gMykgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgICB4bGFiKCJUaW1lIChzKSIpICsNCiAgICB5bGFiKCJDb3VudCIpICsNCiAgICBnZ3RpdGxlKHBhc3RlMCguJGZyZXEsICIgSHoiKSkpICU+JQ0KICBgW1tgKDIpICU+JQ0KICBsYXBwbHkoLiAlPiUgSGlzdFN0YXRzKCkgJT4lIGFzLnRpYmJsZSgpKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFkZF9jb2x1bW4oDQogICAgZnJlcSA9IGMoDQogICAgICByZXAocmVwX21hdHJpeFsxLCAxXSwgcmVwX21hdHJpeFsxLCAyXSksDQogICAgICByZXAocmVwX21hdHJpeFsyLCAxXSwgcmVwX21hdHJpeFsyLCAyXSksDQogICAgICByZXAocmVwX21hdHJpeFszLCAxXSwgcmVwX21hdHJpeFszLCAyXSkNCiAgICApLA0KICAgIC5hZnRlciA9ICJhbmltYWxfaWQiDQogICkNCmBgYA0KDQoNCmBgYHtyIGNhbGN1bGF0aW5nIHJlc3BvbnNlIHByb2IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpSRVNQX1BST0IgPC0gbGVmdF9qb2luKA0KICBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXQ0KICAgICkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgZnJlcSkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShOb19BUHMgPSBsZW5ndGgoZmlyc3RfYXBfcmVsdGltZXMpKSAlPiUNCiAgICBkcGx5cjo6cmVuYW1lKHN0aW1fZnJlcSA9IGZyZXEpICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxID0gcmVwbGFjZShzdGltX2ZyZXEsIHN0aW1fZnJlcSA9PSAxOCwgMjApKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcSA9IHJlcGxhY2Uoc3RpbV9mcmVxLCBzdGltX2ZyZXEgPT0gOCwgMTApKSwNCg0KICBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iLCBzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIikpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZykgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShOb19zdGltID0gbGVuZ3RoKHNpZ25hbF90aW1lKSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXEgPSBhcy5udW1lcmljKHN0aW1fZnJlcV9jYXRlZykpICU+JQ0KICAgIHNlbGVjdCgtc3RpbV9mcmVxX2NhdGVnKQ0KKSAlPiUNCiAgYWRkX2NvbHVtbihOb19BUHNfcmFuZ2UgPSBoaXN0X3N0YXRzICU+JQ0KICAgIGFycmFuZ2UoYW5pbWFsX2lkKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKGZyZXEgPSByZXBsYWNlKGZyZXEsIGZyZXEgPT0gMTgsIDIwKSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmcmVxID0gcmVwbGFjZShmcmVxLCBmcmVxID09IDgsIDEwKSkgJT4lDQogICAgZHBseXI6OnJlbmFtZShzdGltX2ZyZXEgPSBmcmVxKSAlPiUgcHVsbChyYW5nZV9jb3VudF9zdW0pKSAlPiUNCiAgZHBseXI6Om11dGF0ZShyZXNwX3Byb2IgPSAoTm9fQVBzIC8gTm9fc3RpbSkgKiAxMDApICU+JQ0KICBkcGx5cjo6bXV0YXRlKHJlc3BfcHJvYl9yYW5nZSA9IChOb19BUHNfcmFuZ2UgLyBOb19zdGltKSAqIDEwMCkgJT4lDQogIGFkZF9jb2x1bW4ocGVha19sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUNCiAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgcHVsbChwZWFrKSkgJT4lDQogIGFkZF9jb2x1bW4obWVhbl9sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUNCiAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgcHVsbChtZWFuKSkNCmBgYA0KDQpgYGB7ciBjYWxjdWxhdGluZyBBUCBjb3VudCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCkFQQ291bnQgPC0gZnVuY3Rpb24oYW5pbWFsKSB7DQogIHRtcF9hcCA8LSBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gIkFQIiwgYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkNCg0KICBzdGltX3RyYWlucyA8LSBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKA0KICAgICAgbGFnX3NmYyA9IGxhZyhzdGltX2ZyZXEpLA0KICAgICAgdG1wX3ZhciA9IGlmZWxzZShsYWdfc2ZjID09IHN0aW1fZnJlcSAmICFpcy5uYShsYWdfc2ZjKSwgMCwgMSksDQogICAgICBjdW1fdG1wX3ZhciA9IGN1bXN1bSh0bXBfdmFyKQ0KICAgICkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgc3RpbV9mcmVxLCBjdW1fdG1wX3ZhcikgJT4lDQogICAgZHBseXI6Om11dGF0ZSh0cmFpbl9udW1iZXIgPSBncm91cF9pbmRpY2VzKCkpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoLWxhZ19zZmMsIC10bXBfdmFyLCAtY3VtX3RtcF92YXIpICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KHN0aW1fZnJlcV9jYXRlZywgdHJhaW5fbnVtYmVyLCBzdGltX251bWJlcikgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICAgIE5vX0FQcyA9IGxlbmd0aCh0bXBfYXBbdG1wX2FwID4gc2lnbmFsX3RpbWUgJiB0bXBfYXAgPCBzaWduYWxfdGltZSArIDAuMDVdKSwNCiAgICAgIEFQX3RpbWVzID0gcGFzdGUodG1wX2FwW3RtcF9hcCA+IHNpZ25hbF90aW1lICYgdG1wX2FwIDwgc2lnbmFsX3RpbWUgKyAwLjA1XSwgY29sbGFwc2UgPSAiLCIpLA0KICAgICAgcmFuZ2VfbG93ZXIgPSBzaWduYWxfdGltZSwNCiAgICAgIHJhbmdlX3VwcGVyID0gc2lnbmFsX3RpbWUgKyAwLjA1DQogICAgKSAlPiUNCiAgICBhZGRfY29sdW1uKGFuaW1hbF9pZCA9IGFuaW1hbCwgLmJlZm9yZSA9IDEpICU+JQ0KICAgIHVuZ3JvdXAoKQ0KICByZXR1cm4oc3RpbV90cmFpbnMpDQp9DQoNCkFQQyA8LSBsYXBwbHkoUkVDT1JESU5HUyRhbmltYWxfaWQgJT4lIHVuaXF1ZSgpLCBBUENvdW50KSAlPiUgYmluZF9yb3dzKCkNCmBgYA0KDQoNCiogTGlzdCBvZiB0aWJibGVzIHVzZWQgdG8gc3RvcmUgZGF0YToNCiAgKyBSRUNPUkRJTkdTIHRpYmJsZTogc3RvcmVzIEFQIGFuZCBzdGltIHRpbWUgc3RhbXBzLCBudW1iZXIgb2Ygc3RpbXVsaSBpbiBlYWNoIHRyYWluLCBzdGltdWx1cyBmcmVxdWVuY3kgY2F0ZWdvcmllcyAoZWcuIDggMTAgYW5kIDEyIEh6IGJlbG9uZyB0byAxMCBIeiBjYXRlZ29yeSkNCiAgKyBTVElNX1JFU1VMVFM6IHN0b3JlcyB0aGUgZGF0YSBmb3IgUFNUSHMgKENBUkVGVUwgV0lUSCBUSElTISEgSXQncyBnZW5lcmF0ZWQgYnkgdGhlICJDcmVhdGVQU1RIVGliYmxlIiBmdW5jdGlvbiBidXQgdGhlIGZyZXF1ZW5jaWVzIGhhdmUgdG8gYmUgY2hhbmdlZCBtYW51YWxseSwgYW5kIGl0IGNhbiBjcmVhdGUgZHVwbGljYXRlcyEgSSBoYXZlIHRvIHdvcmsgb24gdGhhdCEgSWYgc29tZXRoaW5nIGRvZXNuJ3QgbG9vayByaWdodCBvbiBQU1RIcyBvciByZXNwb25zZSBwcm9iYWJpbGl0eSBwbG90cywgY2hlY2sgdGhpcyBvbmUgZmlyc3QpDQogICsgaGlzdF9zdGF0czogc3RvcmVzIFBTVEggc3RhdGlzdGljcyBjYWxjdWxhdGVkIGZyb20gZ2dwbG90IA0KICArIFJFU1BfUFJPQjogcmVzcG9uc2UgcHJvYmFiaWxpdHkgYW5kIGxhdGVuY3kgZGF0YSBjYWxjdWxhdGVkIGZyb20gc3RpbSByZXN1bHRzIGFuZCByZWNvcmRpbmdzDQogICsgQVBDOiBudW1iZXIgb2YgQVBzIGFmdGVyIGVhY2ggc3RpbXVsdXMgaW4gYSA1MCBtcyB3aW5kb3cNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFJFQ09SRElOR1MsDQogIGNhcHRpb24gPSAiUkVDT1JESU5HUyB0aWJibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFNUSU1fUkVTVUxUUywNCiAgY2FwdGlvbiA9ICJTVElNX1JFU1VMVFMgdGliYmxlIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmRhdGF0YWJsZShoaXN0X3N0YXRzLA0KICBjYXB0aW9uID0gIlBTVEggc3RhdGlzdGljcyAoaGlzdF9zdGF0cyB0aWJibGUpIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRhdGFibGUoUkVTUF9QUk9CLA0KICBjYXB0aW9uID0gIlJlc3BvbnNlIHByb2JhYmlsaXRpZXMiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGF0YWJsZShBUEMsDQogIGNhcHRpb24gPSAiTnVtYmVyIG9mIEFQcyBmb2xvd2luZyBlYWNoIHN0aW11bHVzIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCg0KIyMgUGxvdHRpbmcNCg0KIyMjIERpc3RyaWJ1dGlvbiBvZiBmcmlzdCBBUHMgYWZ0ZXIgY29ydGljYWwgYWN0aXZhdGlvbg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiZ2VvbV9mbGF0X3Zpb2xpbi5SIikpDQojIFBTVEhfcmFuZ2UgPC0gYygwLCAwLjA1KQ0KZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0NCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHkgPSBmaXJzdF9hcF9yZWx0aW1lcywgeCA9IGFuaW1hbF9pZCkNCikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZ2hhbHZlczo6Z2VvbV9oYWxmX3Zpb2xpbihzaWRlID0gInIiLCB0cmltID0gVCwgc2NhbGUgPSAid2lkdGgiKSArDQogICMgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAieSIsDQogICMgICAgICAgICAgICAgIGRvdHNpemUgPSA0LA0KICAjICAgICAgICAgICAgICBzdGFja2RpciA9ICJkb3duIiwNCiAgIyAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjAwMDIsbWV0aG9kID0gImhpc3RvZG90IixiaW5wb3NpdGlvbnMgPSAiYWxsIiwNCiAgIyAgICAgICAgICAgICAgKSArDQogICMgc2VlOjpnZW9tX3Zpb2xpbmRvdChiaW53aWR0aCA9IDAuMDAwMSxzaXplX2RvdHMgPSA2LCkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwKSwgc2hhcGUgPSAifCIpICsNCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMSwgb3V0bGllci5jb2xvdXIgPSBOQSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgZmFjZXRfd3JhcCh+ZnJlcSkNCmBgYA0KDQojIyMgUFNUSCBAIDEgSHogY29ydGljYWwgYWN0aXZhdGlvbg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgbWFpbiBwbG90DQoNCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDEgJT4lIGFzLmNoYXJhY3RlcigpDQoNCmdwX2hpc3QgPC0gZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0sDQogICAgICBmcmVxID09IGZyZXFfdG9fcGxvdA0KICAgICAgIyBhbmltYWxfaWQgPT0gIkdJSV8yMSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHggPSBmaXJzdF9hcF9yZWx0aW1lcykNCikgKw0KICB4bGltKFBTVEhfcmFuZ2VbMV0sIFBTVEhfcmFuZ2VbMl0pICsNCiAgZ2VvbV9oaXN0b2dyYW0oDQogICAgIyBhZXMoZmlsbCA9IGFuaW1hbF9pZCksDQogICAgYmlud2lkdGggPSAwLjAwMQ0KICApICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICBuYW1lID0gIkFuaW1hbCINCiAgICAjIGd1aWRlID0gRkFMU0UNCiAgKSArDQogIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICB4bGFiKCJUaW1lIChzKSIpICsNCiAgeWxhYigiQ291bnQiKQ0KDQoNCg0KIyMjIGxpbmVzDQpncF9oaXN0ICsNCiAgIyMjIG1lZGlhbg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gbWVkaWFuLA0KICAgICAgeGVuZCA9IG1lZGlhbiwNCiAgICAgIHkgPSB5X21heCArIDcsDQogICAgICB5ZW5kID0geV9tYXggKyAxOA0KICAgICksDQogICAgc2l6ZSA9IDENCiAgKSArDQoNCiAgIyMjIGRhdGEgcmFuZ2UNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IHF1YW50aWxlMjUgLSAxLjUgKiBJUVIsDQogICAgICB4ZW5kID0gcXVhbnRpbGUyNSwNCiAgICAgIHkgPSB5X21heCArIDEyLjUsDQogICAgICB5ZW5kID0geV9tYXggKyAxMi41DQogICAgKQ0KICApICsNCg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHF1YW50aWxlNzUsIHhlbmQgPSBxdWFudGlsZTc1ICsgMS41ICogSVFSLCB5ID0geV9tYXggKyAxMi41LCB5ZW5kID0geV9tYXggKyAxMi41KQ0KICApICsNCg0KICAjIyMgSVFSIChib3gpDQogIGdlb21fcmVjdCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4bWluID0gcXVhbnRpbGUyNSwgeG1heCA9IHF1YW50aWxlNzUsIHltaW4gPSB5X21heCArIDcsIHltYXggPSB5X21heCArIDE4KSwNCiAgICBjb2xvciA9ICJyZWQiLA0KICAgIGFscGhhID0gMCwNCiAgICBpbmhlcml0LmFlcyA9IEYNCiAgKSArDQoNCiAgIyMjIG1lYW4NCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbiwgeSA9IHlfbWF4ICsgNCksIHNpemUgPSAyDQogICkgKw0KDQogICMjIyBwZWFrDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBlYWssIHkgPSB5X21heCArIDQpLA0KICAgIHNoYXBlID0gMjUsDQogICAgc2l6ZSA9IDIsDQogICAgZmlsbCA9ICJyZWQiDQogICkNCmBgYA0KDQojIyMgUFNUSCBAIDEwIEh6IGNvcnRpY2FsIGFjdGl2YXRpb24NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIG1haW4gcGxvdA0KDQojIyMgc2V0IFBTVEggcmFuZ2U6IHNlZSBlYXJsaWVyIChjYWxjdWxhdGluZyBoaXN0IHN0YXRzIGNodW5rKQ0KDQojIyMgc2VsZWN0IGZyZXF1ZW5jeSB0byBwbG90ICgxLCA4LCAxOCkNCmZyZXFfdG9fcGxvdCA8LSA4ICU+JSBhcy5jaGFyYWN0ZXIoKQ0KDQpncF9oaXN0IDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSBmcmVxX3RvX3Bsb3QNCiAgICAgICMgYW5pbWFsX2lkID09ICJHSUlfMjEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQopICsNCiAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogIGdlb21faGlzdG9ncmFtKA0KICAgICMgYWVzKGZpbGwgPSBhbmltYWxfaWQpLA0KICAgIGJpbndpZHRoID0gMC4wMDENCiAgKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgIHBhbGV0dGUgPSAiU2V0MyIsDQogICAgbmFtZSA9ICJBbmltYWwiDQogICAgIyBndWlkZSA9IEZBTFNFDQogICkgKw0KICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgeGxhYigiVGltZSAocykiKSArDQogIHlsYWIoIkNvdW50IikNCg0KDQoNCiMjIyBsaW5lcw0KZ3BfaGlzdCArDQogICMjIyBtZWRpYW4NCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IG1lZGlhbiwNCiAgICAgIHhlbmQgPSBtZWRpYW4sDQogICAgICB5ID0geV9tYXggKyA3LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTgNCiAgICApLA0KICAgIHNpemUgPSAxDQogICkgKw0KDQogICMjIyBkYXRhIHJhbmdlDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBxdWFudGlsZTI1IC0gMS41ICogSVFSLA0KICAgICAgeGVuZCA9IHF1YW50aWxlMjUsDQogICAgICB5ID0geV9tYXggKyAxMi41LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTIuNQ0KICAgICkNCiAgKSArDQoNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBxdWFudGlsZTc1LCB4ZW5kID0gcXVhbnRpbGU3NSArIDEuNSAqIElRUiwgeSA9IHlfbWF4ICsgMTIuNSwgeWVuZCA9IHlfbWF4ICsgMTIuNSkNCiAgKSArDQoNCiAgIyMjIElRUiAoYm94KQ0KICBnZW9tX3JlY3QoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeG1pbiA9IHF1YW50aWxlMjUsIHhtYXggPSBxdWFudGlsZTc1LCB5bWluID0geV9tYXggKyA3LCB5bWF4ID0geV9tYXggKyAxOCksDQogICAgY29sb3IgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAsDQogICAgaW5oZXJpdC5hZXMgPSBGDQogICkgKw0KDQogICMjIyBtZWFuDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1lYW4sIHkgPSB5X21heCArIDQpLCBzaXplID0gMg0KICApICsNCg0KICAjIyMgcGVhaw0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBwZWFrLCB5ID0geV9tYXggKyA0KSwNCiAgICBzaGFwZSA9IDI1LA0KICAgIHNpemUgPSAyLA0KICAgIGZpbGwgPSAicmVkIg0KICApDQpgYGANCg0KIyMjIFBTVEggQCAyMCBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIG1haW4gcGxvdA0KDQojIyMgc2V0IFBTVEggcmFuZ2U6IHNlZSBlYXJsaWVyIChjYWxjdWxhdGluZyBoaXN0IHN0YXRzIGNodW5rKQ0KDQojIyMgc2VsZWN0IGZyZXF1ZW5jeSB0byBwbG90ICgxLCA4LCAxOCkNCmZyZXFfdG9fcGxvdCA8LSAxOCAlPiUgYXMuY2hhcmFjdGVyKCkNCg0KZ3BfaGlzdCA8LSBnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXSwNCiAgICAgIGZyZXEgPT0gZnJlcV90b19wbG90DQogICAgICAjIGFuaW1hbF9pZCA9PSAiR0lJXzIxIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KKSArDQogIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgNCiAgICAjIGFlcyhmaWxsID0gYW5pbWFsX2lkKSwNCiAgICBiaW53aWR0aCA9IDAuMDAxDQogICkgKw0KICBzY2FsZV9maWxsX2JyZXdlcigNCiAgICBwYWxldHRlID0gIlNldDMiLA0KICAgIG5hbWUgPSAiQW5pbWFsIg0KICAgICMgZ3VpZGUgPSBGQUxTRQ0KICApICsNCiAgZmFjZXRfd3JhcCh+YW5pbWFsX2lkLCBuY29sID0gMykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArDQogIHhsYWIoIlRpbWUgKHMpIikgKw0KICB5bGFiKCJDb3VudCIpDQoNCg0KDQojIyMgbGluZXMNCmdwX2hpc3QgKw0KICAjIyMgbWVkaWFuDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBtZWRpYW4sDQogICAgICB4ZW5kID0gbWVkaWFuLA0KICAgICAgeSA9IHlfbWF4ICsgNywNCiAgICAgIHllbmQgPSB5X21heCArIDE4DQogICAgKSwNCiAgICBzaXplID0gMQ0KICApICsNCg0KICAjIyMgZGF0YSByYW5nZQ0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gcXVhbnRpbGUyNSAtIDEuNSAqIElRUiwNCiAgICAgIHhlbmQgPSBxdWFudGlsZTI1LA0KICAgICAgeSA9IHlfbWF4ICsgMTIuNSwNCiAgICAgIHllbmQgPSB5X21heCArIDEyLjUNCiAgICApDQogICkgKw0KDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcXVhbnRpbGU3NSwgeGVuZCA9IHF1YW50aWxlNzUgKyAxLjUgKiBJUVIsIHkgPSB5X21heCArIDEyLjUsIHllbmQgPSB5X21heCArIDEyLjUpDQogICkgKw0KDQogICMjIyBJUVIgKGJveCkNCiAgZ2VvbV9yZWN0KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHhtaW4gPSBxdWFudGlsZTI1LCB4bWF4ID0gcXVhbnRpbGU3NSwgeW1pbiA9IHlfbWF4ICsgNywgeW1heCA9IHlfbWF4ICsgMTgpLA0KICAgIGNvbG9yID0gInJlZCIsDQogICAgYWxwaGEgPSAwLA0KICAgIGluaGVyaXQuYWVzID0gRg0KICApICsNCg0KICAjIyMgbWVhbg0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBtZWFuLCB5ID0geV9tYXggKyA0KSwgc2l6ZSA9IDINCiAgKSArDQoNCiAgIyMjIHBlYWsNCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcGVhaywgeSA9IHlfbWF4ICsgNCksDQogICAgc2hhcGUgPSAyNSwNCiAgICBzaXplID0gMiwNCiAgICBmaWxsID0gInJlZCINCiAgKQ0KYGBgDQoNCg0KIyMjIFJlc3BvbnNlIHByb2JhYmlsaXR5IGFuZCBsYXRlbmN5DQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFJFU1BfUFJPQiwgIyAlPiUNCiAgIyBkcGx5cjo6ZmlsdGVyKGFuaW1hbF9pZCAhPSAiR0lJXzIwIiksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGFzLmZhY3RvcihzdGltX2ZyZXEpLA0KICAgIHkgPSByZXNwX3Byb2JfcmFuZ2UNCiAgKQ0KKSArDQogIGdlb21fYm94cGxvdChhbHBoYSA9IDAsIHdpZHRoID0gMC4yLCBsd2QgPSAxLCBmYXR0ZW4gPSAxLjIpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoDQogICAgICAjIGZpbGwgPSBhbmltYWxfaWQNCiAgICApLA0KICAgIGZpbGwgPSAiZ3JheSIsDQogICAgY29sb3IgPSAiYmxhY2siLA0KICAgIHNpemUgPSAzLA0KICAgIHNoYXBlID0gMjEsDQogICAgIyBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpDQogICkgKw0KICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBhbmltYWxfaWQpKSArDQogIHhsYWIoIlN0aW11bHVzIGZyZXF1ZW5jeSIpICsNCiAgeWxhYigiUmVzcG9uc2UgcHJvYmFiaWxpdHkiKSArDQogIGdlb21fc2lnbmlmKA0KICAgIGNvbXBhcmlzb25zID0gbGlzdChjKCIxIiwgIjEwIikpLA0KICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgIHRlc3QgPSAibW9vZC50ZXN0IiwNCiAgICBjb2xvciA9ICJncmF5Ig0KICApICsNCiAgZ2VvbV9zaWduaWYoDQogICAgY29tcGFyaXNvbnMgPSBsaXN0KGMoIjEwIiwgIjIwIikpLA0KICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgIHRlc3QgPSAibW9vZC50ZXN0IiwNCiAgICBtYXJnaW5fdG9wID0gLjEsDQogICAgY29sb3IgPSAiZ3JheSINCiAgKSArDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBhZXMobGFiZWwgPSBhbmltYWxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0uNQ0KICApDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFJFU1BfUFJPQiAlPiUNCiAgICBnYXRoZXIoDQogICAgICBrZXkgPSAibGF0ZW5jeV90eXBlIiwNCiAgICAgIHZhbHVlID0gImxhdGVuY3lfdmFsdWUiLA0KICAgICAgcGVha19sYXRlbmN5LA0KICAgICAgbWVhbl9sYXRlbmN5DQogICAgKSAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGFuaW1hbF9pZCAhPSAiR0lJXzIwIiksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGFzLmZhY3RvcihzdGltX2ZyZXEpLA0KICAgIHkgPSBsYXRlbmN5X3ZhbHVlICogMTAwMA0KICApDQopICsNCiAgIyMjIGRhdGEgdmlzdWFsaXphdGlvbiBsYXllcnMNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoZmlsbCA9IGxhdGVuY3lfdHlwZSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjQpLA0KICAgIHNpemUgPSAzLA0KICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICBzaGFwZSA9IDIxDQogICkgKw0KICBnZW9tX2JveHBsb3QoDQogICAgYWVzKGNvbG9yID0gbGF0ZW5jeV90eXBlKSwNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuNCksDQogICAgd2lkdGggPSAwLjMsDQogICAgYWxwaGEgPSAwLA0KICAgIGx3ZCA9IDEsDQogICAgZmF0dGVuID0gMS4yDQogICkgKw0KICB5bGltKDAsIDI1KSArDQogIHhsYWIoIlN0aW11bHVzIGZyZXF1ZW5jeSIpICsNCiAgeWxhYigiUGVhayBsYXRlbmN5IikgKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZSgNCiAgICBuYW1lID0gIkxhdGVuY3kiLA0KICAgIGJyZWFrcyA9IGMoIm1lYW5fbGF0ZW5jeSIsICJwZWFrX2xhdGVuY3kiKSwNCiAgICBsYWJlbHMgPSBjKCJNZWFuIiwgIlBlYWsiKSwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGNvbG9yID0gYyhyZXAoTkEsIDIpKSkpDQogICkgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKA0KICAgIG5hbWUgPSAiTGF0ZW5jeSIsDQogICAgYnJlYWtzID0gYygibWVhbl9sYXRlbmN5IiwgInBlYWtfbGF0ZW5jeSIpLA0KICAgIGxhYmVscyA9IGMoIk1lYW4iLCAiUGVhayIpDQogICkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQoNCiMjIyBOdW1iZXIgb2YgQVBzIGFmdGVyIGVhY2ggc3RpbXVsdXMgaW4gc3RpbXVsdXMgdHJhaW5zICg1MCBtcyB3aW5kb3cpDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gQVBDICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3RpbV9mcmVxX2NhdGVnICVpbiUgYygiMSIsICIxMCIsICIyMCIpLCBzdGltX251bWJlciA8IDExKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkLCBzdGltX2ZyZXFfY2F0ZWcsIHN0aW1fbnVtYmVyKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX0FQcyA9IHN1bShOb19BUHMpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgICBOb19BUF9tZWFuID0gbWVhbihOb19BUHMpLA0KICAgICAgTm9fQVBfc2QgPSBzZChOb19BUHMpLA0KICAgICAgU0VNID0gc2QoTm9fQVBzKSAvIHNxcnQobGVuZ3RoKE5vX0FQcykpDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gc3RpbV9udW1iZXIsDQogICAgeSA9IE5vX0FQX21lYW4sDQogICAgY29sb3VyID0gYXMuZmFjdG9yKHN0aW1fZnJlcV9jYXRlZyksDQogICAgZ3JvdXAgPSBhcy5mYWN0b3Ioc3RpbV9mcmVxX2NhdGVnKQ0KICApDQopICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICB4bGFiKCJOby4gc3RpbXVsdXMgaW4gdHJhaW4iKSArDQogIHlsYWIoIk1lYW4gbm8uIEFQcyBhY2Nyb3NzIGFuaW1hbHMiKSArDQogIGxhYnMoY29sb3IgPSAiRnJlcXVlbmN5IikgKw0KICB5bGltKDAsIDE4KSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYXMuY2hhcmFjdGVyKGMoMToxMCkpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gQVBDICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3RpbV9mcmVxX2NhdGVnICVpbiUgYygiMSIsICIxMCIsICIyMCIpLCBzdGltX251bWJlciA8IDExKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkLCBzdGltX2ZyZXFfY2F0ZWcsIHN0aW1fbnVtYmVyKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX0FQcyA9IHN1bShOb19BUHMpKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gc3RpbV9udW1iZXIsDQogICAgeSA9IE5vX0FQcywNCiAgICBjb2xvciA9IGFzLmZhY3RvcihhbmltYWxfaWQpLA0KICAgIGxpbmV0eXBlID0gYXMuZmFjdG9yKGFuaW1hbF9pZCkNCiAgKQ0KKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fbGluZSgpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKDE6MTApLCBicmVha3MgPSBjKDE6MTApKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IC4gJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN0aW1fbnVtYmVyID09IDEwKSwNCiAgICBhZXMobGFiZWwgPSBhbmltYWxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0yLA0KICAgIGFscGhhID0gLjcNCiAgKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IDEyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KDQogICMgeGxpbSgxLDEwKSArDQogIGZhY2V0X3dyYXAofnN0aW1fZnJlcV9jYXRlZykgKw0KICBsYWJzKGxpbmV0eXBlID0gIkFuaW1hbHMiLCBjb2xvciA9ICJBbmltYWxzIikgKw0KICB4bGFiKCJOby4gc3RpbXVsdXMgaW4gdHJhaW4iKSArDQogIHlsYWIoIk51bWJlciBvZiBBUHMiKQ0KYGBgDQoNCg0KDQojIFNwb250YW5lb3VzIGRlc3luY2hyb25pemF0aW9uIG9mIHRoZSBGQyBzbG93IG9zY2lsbGF0aW9uIA0KDQojIyBMb2FkaW5nIGRhdGEgDQoNCkxvYWRpbmcgbWF0IGZpbGVzIHRvICpmaWxlX2xpc3QqIG9iamVjdA0KDQpFeGFtcGxlIGZpbGU6ICoqMDhfcmlnaHRfUG5PX3Q1XzQwODNfYmFzZWxpbmUxX3dha2UubWF0IioqDQoNCmBgYHtyLCAgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpmaWxlX2xpc3QgPC0gbGlzdC5maWxlcygNCiAgcGF0aCA9ICJkYXRhIiwNCiAgcGF0dGVybiA9ICIqLm1hdCIsIGZ1bGwubmFtZXMgPSBGLCByZWN1cnNpdmUgPSBGDQopDQoNCmBgYA0KDQpDb250ZW50IG9mIG1hdCBmaWxlczoNCg0KKiBBUCBjaGFubmVsDQogICsgKip0aXRsZToqKiBjaGFubmVsIG5hbWUNCiAgKyAqKmNvbW1lbnQ6Kiogbm90ZXMgYWJvdXQgdGhlIGNoYW5uZWwNCiAgKyAqKnJlc29sdXRpb246KiogMi41ZS0wNg0KICArICoqaW50ZXJ2YWw6KiogdGltZSBiZXR3ZWVuIHR3byBkYXRhIHBvaW50cyBpbiBzZWMgKDVlLTA1KQ0KICArICoqc2NhbGU6Kiogc2NhbGluZyBmYWN0b3IgKHkgc2NhbGUpLCByZWFsID0gKGRhdGEgKiBzY2FsZSkgKyBvZmZzZXQNCiAgKyAqKm9mZnNldDoqKiBzY2FsZSBvZmZzZXQNCiAgKyAqKnVuaXRzOioqIHVuaXQgb2YgdGhlIGNoYW5uZWwgKHZvbHQpDQogICsgKipsZW5ndGg6KiogbnVtYmVyIG9mIEFQcw0KICArICoqaXRlbXM6KiogTm8uIHBvaW50cyBlYXNjaCBBUCBpcyByZXByZXNlbnRlZCBieQ0KICArICoqdHJpZ2dlcjoqKg0KICArICoqdHJhY2VzOioqDQogICsgKip0aW1lczoqKiB0aW1lcyBvZiB0aGUgQVBzIChmaXJzdCBkYXRhIHBvaW50IG9mIHRoZSB3YXZlZm9ybSkNCiAgKyAqKmNvZGVzOioqIG1hcmtlciBjb2RlcyBvZiB0aGUgQVBzDQogICsgKip2YWx1ZXM6KiogbWF0cml4IGNvbnRhaW5pbmcgdGhlIHdhdmVmb3JtcyBvZiB0aGUgQVBzIChkZXNjcmliZWQgYnkgYSBnaXZlbiBOby4gcG9pbnRzKQ0KIA0KKiBFRUcgY2hhbm5lbA0KICArICoqdGl0bGU6KiogY2hhbm5lbCBuYW1lDQogICsgKipjb21tZW50OioqDQogICsgKippbnRlcnZhbDoqKg0KICArICoqc2NhbGU6Kiogc2NhbGluZyBmYWN0b3IgKHkgc2NhbGUpLCByZWFsID0gKGRhdGEgKiBzY2FsZSkgKyBvZmZzZXQNCiAgKyAqKm9mZnNldDoqKiBzY2FsZSBvZmZzZXQNCiAgKyAqKnVuaXRzOioqDQogICsgKipzdGFydDoqKg0KICArICoqbGVuZ3RoOioqDQogICsgKip2YWx1ZXM6KioNCg0KYGBge3J9DQpmaWxlX3RvX2xvYWQgPC0gZmlsZV9saXN0W1sxXV0NCmZpbGVuYW1lIDwtIGFzLmNoYXJhY3RlcihzdWJzdHJpbmcoZmlsZV90b19sb2FkLCAxLCBuY2hhcihmaWxlX3RvX2xvYWQpIC0gNCkpDQpyYXcucmVjIDwtIHJlYWRNYXQoZmlsZS5wYXRoKCJkYXRhIiwgZmlsZV90b19sb2FkKSkNCg0KIyMjIHRha2VzIHRoZSBmaXJzdCBBUCAoZmlyc3Qgcm93KSBhbmQgdGVsbHMgdGhlIGluZGV4IG9mIHBvaW50IHdpdGggdGhlIG1heCB2YWx1ZQ0KcG9pbnRzX3RvX3BlYWsgPC0gd2hpY2gocmF3LnJlYyRhcFssICwgMV0kdmFsdWVzWzEsIF0gPT0NCiAgbWF4KHJhdy5yZWMkYXBbLCAsIDFdJHZhbHVlc1sxLCBdKSkgJT4lDQogIGFzLm51bWVyaWMoKQ0KDQojIyMgdGltZSBvZiB0aGUgcGVhayBvZiB0aGUgQVBzIGFmdGVyIGl0cyBmaXJzdCBwb2ludA0KcmF3LnJlYyRhcFssICwgMV0kaW50ZXJ2YWwgKiBwb2ludHNfdG9fcGVhaw0KDQphcCA8LSByYXcucmVjJGFwWywgLCAxXSR0aW1lcyAlPiUgYXMuZG91YmxlKCkNCmFwX3BlYWtzIDwtIHRpYmJsZShwZWFrX3RpbWVzID0gKGFwICsgYyhyYXcucmVjJGFwWywgLCAxXSRpbnRlcnZhbCAqIHBvaW50c190b19wZWFrKSkpDQpgYGANCg0KDQoNCkxvYWRpbmcgYWxsIGRhdGEgY2FsY3VsYXRlZCBieSAqKlN5bmNEZXN5bmNBbmFseXNpcyoqIGZ1bmN0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQphbGxfZWVnX2RmIDwtIHJlYWRSRFMoZmlsZSA9IGZpbGUucGF0aCgiZGF0YSIsICJzeW5jX2Rlc3luYyIsICJzeW5jX2Rlc3luY190aWJibGVzLnJkcyIpKQ0KRUVHX2RzX2RmIDwtIHB1cnJyOjpyZWR1Y2UoYWxsX2VlZ19kZiwgYmluZF9yb3dzKQ0KYGBgDQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBJU0kgdG8gZGV0ZXJtaW5lIGNsdXN0ZXJzDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0gMTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ19pc2lfcGVyaW9kcyA8LSBsYXBwbHkoYWxsX2VlZ19kZiwgZnVuY3Rpb24oeCkgew0KICBnZ3Bsb3QoDQogICAgZGF0YSA9IHggJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBBUCA9PSAxLA0KICAgICAgICAhaXMubmEoZWVnX3N0YXRlKSwNCiAgICAgICAgc3RhdGVfbGVuZ3RoID49IDEgLyBmaXJzdF9wZWFrICogMiwNCiAgICAgICAgaXNpID4gMCwgaXNpIDwgMSAvIGZpcnN0X3BlYWsNCiAgICAgICksICMjIyBOQXMgaW4gZWVnX3N0YXRlIGJlY2F1c2UgbW92aW5nX3NkIGhhcyBOQXMgYXQgdGhlIGVuZA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IGlzaSkNCiAgKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKA0KICAgICAgZmlsbCA9IGVlZ19zdGF0ZSwNCiAgICAgIGNvbG9yID0gZWVnX3N0YXRlDQogICAgKSwNCiAgICBhbHBoYSA9IC4zLA0KICAgIGJpbnMgPSB4JG5iaW5zICU+JSB1bmlxdWUoKQ0KICAgICkgKw0KICAgIGdlb21fdmxpbmUoDQogICAgICB4aW50ZXJjZXB0ID0geCRidXJzdF90aHJlc2hvbGRfaXNpICU+JSB1bmlxdWUoKQ0KICAgICkgKw0KICAgIGFubm90YXRlKA0KICAgICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgIHggPSB4JGJ1cnN0X3RocmVzaG9sZF9pc2kgJT4lIHVuaXF1ZSgpIC0geCRidXJzdF90aHJlc2hvbGRfaXNpICU+JSB1bmlxdWUoKSAvIDcsDQogICAgICB5ID0gSW5mLA0KICAgICAgbGFiZWwgPSBwYXN0ZTAoIkJ1cnN0IHRocmVzaG9sZCA9ICIsIHgkYnVyc3RfdGhyZXNob2xkX2lzaSAlPiUgdW5pcXVlKCkpLA0KICAgICAgYW5nbGUgPSA5MCwNCiAgICAgIGhqdXN0ID0gMS4yDQogICAgKSArDQogICAgbGFicyhjYXB0aW9uID0geCRJRCAlPiUgdW5pcXVlKCkpDQp9KQ0KDQoNCiMjIyBodHRwczovL2dpdGh1Yi5jb20va2Fzc2FtYmFyYS9nZ3B1YnIvaXNzdWVzLzE1OA0KIyMjIGJ1ZyEhISBoYWQgdG8gb3BlbiBhIE5VTEwgcGRmIGRldmljZQ0KcGRmKE5VTEwpDQpwX2lzaSA8LSBnZ3B1YnI6OmdnYXJyYW5nZShwbG90bGlzdCA9IGdnX2lzaV9wZXJpb2RzLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQp4IDwtIGRldi5vZmYoKQ0KDQpwX2lzaQ0KYGBgDQoNCiMjIyBMRlAgYW5kIEFQcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MjAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90dGluZ19yZWdpb24gPC0gYyg5MCwgMTUwKQ0KDQojIHBsb3R0aW5nX3JlZ2lvbiA8LSBjKGFsbF9lZWdfZGZbWzRdXSR0aW1lc1tsZW5ndGgoYWxsX2VlZ19kZltbNF1dJHRpbWVzKV0gLSA4MCwgYWxsX2VlZ19kZltbNF1dJHRpbWVzW2xlbmd0aChhbGxfZWVnX2RmW1s0XV0kdGltZXMpXSkNCg0KZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsNCiAgaHVlcyA8LSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpDQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dDQp9DQoNCmVlZ19zdW1fcGxvdCA8LSBsYXBwbHkoYWxsX2VlZ19kZiwgZnVuY3Rpb24oeCkgew0KICByZWN0X2luZGV4IDwtDQogICAgdGliYmxlKA0KICAgICAgc3RhdGVfc3RhcnQgPSBzdWJzZXQoeCwgc3RhdGVfbGVuZ3RoIDw9IDEgLyBmaXJzdF9wZWFrICogMikgJT4lDQogICAgICAgIGRwbHlyOjpzZWxlY3Qoc3RhdGVfc3RhcnQsIHN0YXRlX2VuZCkgJT4lIHB1bGwoc3RhdGVfc3RhcnQpICU+JSB1bmlxdWUoKSwNCiAgICAgIHN0YXRlX2VuZCA9IHN1YnNldCh4LCBzdGF0ZV9sZW5ndGggPD0gMSAvIGZpcnN0X3BlYWsgKiAyKSAlPiUNCiAgICAgICAgZHBseXI6OnNlbGVjdChzdGF0ZV9zdGFydCwgc3RhdGVfZW5kKSAlPiUgcHVsbChzdGF0ZV9lbmQpICU+JSB1bmlxdWUoKQ0KICAgICkNCg0KDQogIGdncGxvdCgNCiAgICBkYXRhID0gZHBseXI6OmZpbHRlcih4LCB0aW1lcyA+IHBsb3R0aW5nX3JlZ2lvblsxXSwgdGltZXMgPCBwbG90dGluZ19yZWdpb25bMl0pLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHRpbWVzLCB5ID0gZWVnX3ZhbHVlcykNCiAgKSArDQogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9ICJncmF5IikpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBtYXBwaW5nID0gYWVzKHggPSB0aW1lcywgeSA9IG1vdmluZ19zZCwgY29sb3IgPSBnZ19jb2xvcl9odWUoMilbMV0pLCBzaXplID0gMQ0KICAgICkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHRpbWVzLCB5ID0gbGV2ZWxzICsgMywgY29sb3IgPSBnZ19jb2xvcl9odWUoMilbMl0pLCBzaXplID0gMQ0KICAgICkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIG1hcHBpbmcgPSBhZXMoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgIHggPSBwbG90dGluZ19yZWdpb25bMV0gLSAyLCB4ZW5kID0gcGxvdHRpbmdfcmVnaW9uWzJdICsgMiwNCiAgICAgIHkgPSB4JHNkX3RocmVzaG9sZCAlPiUgdW5pcXVlKCksIHllbmQgPSB4JHNkX3RocmVzaG9sZCAlPiUgdW5pcXVlKCksDQogICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiDQogICAgKSArDQogICAgZ2VvbV9wb2ludCgNCiAgICAgIGRhdGEgPSAuICU+JSBkcGx5cjo6ZmlsdGVyKCFpcy5uYShhcF9wZWFrX3RpbWVzKSksDQogICAgICBtYXBwaW5nID0gYWVzKHggPSBhcF9wZWFrX3RpbWVzLCB5ID0gNSksDQogICAgICBzaGFwZSA9ICJ8IiwNCiAgICAgIHNpemUgPSA0LA0KICAgICAgY29sb3IgPSAiZGFyayBncmF5Ig0KICAgICkgKw0KICAgIGdlb21fcG9pbnQoDQogICAgICBkYXRhID0gLiAlPiUgZHBseXI6OmZpbHRlcihidXJzdF9pc2kgPT0gMSksDQogICAgICBtYXBwaW5nID0gYWVzKHggPSB0aW1lcywgeSA9IGJ1cnN0X2lzaSArIDQpLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2hhcGUgPSAifCIsDQogICAgICBzaXplID0gNQ0KICAgICkgKw0KICAgIGdlb21fcmVjdCgNCiAgICAgIGRhdGEgPSBkcGx5cjo6ZmlsdGVyKHJlY3RfaW5kZXgsIHN0YXRlX3N0YXJ0ID4gcGxvdHRpbmdfcmVnaW9uWzFdLCBzdGF0ZV9zdGFydCA8IHBsb3R0aW5nX3JlZ2lvblsyXSksDQogICAgICBpbmhlcml0LmFlcyA9IEYsDQogICAgICBtYXBwaW5nID0gYWVzKHhtaW4gPSBzdGF0ZV9zdGFydCwgeG1heCA9IHN0YXRlX2VuZCwgeW1pbiA9IC1JbmYsIHltYXggPSArSW5mKSwgZmlsbCA9ICJwaW5rIiwgYWxwaGEgPSAwLjUNCiAgICApICsNCiAgICB5bGFiKCJFRUcgW2F1XSIpICsNCiAgICB4bGFiKCJUaW1lIikgKw0KDQogICAgIyMjIGNyZWF0aW5nIGxlZ2VuZA0KICAgIHNjYWxlX2NvbG9yX2lkZW50aXR5KA0KICAgICAgbmFtZSA9ICJMaW5lcyIsDQogICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gYyhyZXAoTkEsIDQpKSkpLA0KICAgICAgYnJlYWtzID0gYygiZ3JheSIsIGdnX2NvbG9yX2h1ZSgyKVsxXSwgZ2dfY29sb3JfaHVlKDIpWzJdLCAiYmxhY2siKSwNCiAgICAgIGxhYmVscyA9IGMoIkVFRyIsICJNb3ZpbmcgU0QiLCAiTGV2ZWxzIiwgIlNEIHRocmVzaG9sZCIpDQogICAgKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKGNhcHRpb24gPSB4JElEICU+JSB1bmlxdWUoKSkNCn0pDQoNCnBkZihOVUxMKQ0KcF9lZWcgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoDQogIHBsb3RsaXN0ID0gZWVnX3N1bV9wbG90LA0KICBjb21tb24ubGVnZW5kID0gVFJVRSwNCiAgbGVnZW5kID0gImJvdHRvbSIsIG5jb2wgPSAxDQopDQp4IDwtIGRldi5vZmYoKQ0KDQpwX2VlZw0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgY2x1c3RlcnMgaW4gc3luYyB2cyBkZXN5bmMgcGVyaW9kcw0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxlZnRfam9pbigNCiAgRUVHX2RzX2RmICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGVlZ19zdGF0ZSksIHN0YXRlX2xlbmd0aCA+PSAxIC8gZmlyc3RfcGVhayAqIDIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShJRCwgZWVnX3N0YXRlKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKE5vX2NsdXN0ZXJzID0gc3VtKGJ1cnN0X2lzaSwgbmEucm0gPSBUKSksDQogIEVFR19kc19kZiAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShlZWdfc3RhdGUpLCBzdGF0ZV9sZW5ndGggPj0gMSAvIGZpcnN0X3BlYWsgKiAyKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoSUQsIGVlZ19zdGF0ZSkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShzdGF0ZV9sZW5ndGhfc3VtID0gc3VtKHN0YXRlX2xlbmd0aCAlPiUgdW5pcXVlKCksIG5hLnJtID0gVCkpDQopICU+JQ0KICBkcGx5cjo6ZmlsdGVyKCFncmVwbChwYXR0ZXJuID0gIjAxfDA0IiwgSUQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZWVnX3N0YXRlLCB5ID0gTm9fY2x1c3RlcnMgLyBzdGF0ZV9sZW5ndGhfc3VtKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2wgPSBJRCksIHNpemUgPSAzKSArDQogIGdlb21fbGluZShhZXMoY29sID0gSUQsIGdyb3VwID0gSUQpKSArDQogIGdlb21fYm94cGxvdCgNCiAgICBhZXMoeCA9IGVlZ19zdGF0ZSwgeSA9IE5vX2NsdXN0ZXJzIC8gc3RhdGVfbGVuZ3RoX3N1bSksDQogICAgaW5oZXJpdC5hZXMgPSBGLA0KICAgIGFscGhhID0gMCwgd2lkdGggPSAwLjIsIGx3ZCA9IDEsIGZhdHRlbiA9IDEuMg0KICApICsNCiAgZ2VvbV9zaWduaWYoDQogICAgY29tcGFyaXNvbnMgPSBsaXN0KGMoImRlc3luYyIsICJzeW5jIikpLA0KICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgIHRlc3QgPSAid2lsY294LnRlc3QiLA0KICAgIG1hcmdpbl90b3AgPSAuMSwNCiAgICBjb2xvciA9ICJkYXJrZ3JheSINCiAgKSArDQogIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsIHBhaXJlZCA9IEYpDQoNCiMgZ2VvbV90ZXh0X3JlcGVsKA0KIyAgIGRhdGEgPSAuICU+JSBkcGx5cjo6ZmlsdGVyKGVlZ19zdGF0ZSA9PSAic3luYyIpLA0KIyAgIGFlcyhsYWJlbCA9IElEKSwNCiMgICBkaXJlY3Rpb24gPSAieSIsDQojICAgaGp1c3QgPSAtMSkNCmBgYA0KDQoNCg0KDQojIFRlcm1pbmFscw0KDQojIyBMb2FkaW5nIGRhdGENCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZmlsZV9wYXRoIDwtIGZpbGUucGF0aCgNCiAgImRhdGEiLA0KICAiRW1pX3Rlcm1pbmFscyIsDQogICJ0ZXJtaW5hbF9tZWFzdXJlcy5jc3YiDQopDQpURVJNSU5BTFMgPC0gcmVhZC50YWJsZShmaWxlID0gZmlsZV9wYXRoLCBzZXAgPSAiOyIsIGhlYWRlciA9IFQsIG5hLnN0cmluZyA9ICJuYSIpDQpoZWFkKFRFUk1JTkFMUykNCmBgYA0KDQojIyBCb3V0b24gYXJlYSBvbiBkaWZmZXJlbnQgZGVuZHJpdGljIGRvbWFpbnMNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBURVJNSU5BTFMsIG1hcHBpbmcgPSBhZXMoeCA9IHBvc3Rpb24sIHkgPSBiX2FyZWEpKSArDQogIGdlb21faGFsZl92aW9saW4oDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gLS4xNSksDQogICAgdHJpbSA9IEYsDQogICAgc2lkZSA9ICJsIiwNCiAgICBzY2FsZSA9ICJhcmVhIiwNCiAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KSwNCiAgICBhZXMoZmlsbCA9IHBvc3Rpb24pDQogICkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpKQ0KYGBgDQoNCiMjIEFyZWEgb2YgYm91dG9ucyB3aXRoICptMiogYW5kICp1bmtub3duKiBvcmlnaW4NCg0KYGBge3IgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gVEVSTUlOQUxTLA0KICBtYXBwaW5nID0gYWVzKHggPSBvcmlnaW4sIHkgPSBiX2FyZWEpDQopICsNCiAgZ2VvbV9oYWxmX3Zpb2xpbigNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAtLjE1KSwNCiAgICB0cmltID0gRiwNCiAgICBzaWRlID0gImwiLA0KICAgIHNjYWxlID0gImNvdW50IiwNCiAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KQ0KICAgICMgZmlsbCA9IGFscGhhKDAuMSksDQogICAgIyBhZXMoY29sID0gcG9zdGlvbikNCiAgKSArDQogIGdlb21faml0dGVyKA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMSksDQogICAgYWVzKGNvbCA9IHBvc3Rpb24pDQogICkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgeCA9IDAuNywNCiAgICB5ID0gMSwNCiAgICBsYWJlbCA9IHBhc3RlKA0KICAgICAgIm4gPSAiLA0KICAgICAgVEVSTUlOQUxTICU+JQ0KICAgICAgICBkcGx5cjo6Z3JvdXBfYnkob3JpZ2luKSAlPiUNCiAgICAgICAgZHBseXI6OnN1bW1hcmlzZShuID0gbGVuZ3RoKGJfYXJlYSkpICU+JQ0KICAgICAgICBkcGx5cjo6ZmlsdGVyKG9yaWdpbiA9PSAibTIiKSAlPiUNCiAgICAgICAgc2VsZWN0KG4pICU+JQ0KICAgICAgICBhcy5jaGFyYWN0ZXIoKQ0KICAgICkNCiAgKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICB4ID0gMS42LA0KICAgIHkgPSAxLA0KICAgIGxhYmVsID0gcGFzdGUoDQogICAgICAibiA9ICIsDQogICAgICBURVJNSU5BTFMgJT4lDQogICAgICAgIGRwbHlyOjpncm91cF9ieShvcmlnaW4pICU+JQ0KICAgICAgICBkcGx5cjo6c3VtbWFyaXNlKG4gPSBsZW5ndGgoYl9hcmVhKSkgJT4lDQogICAgICAgIGRwbHlyOjpmaWx0ZXIob3JpZ2luID09ICJ1bmtub3duIikgJT4lDQogICAgICAgIHNlbGVjdChuKSAlPiUNCiAgICAgICAgYXMuY2hhcmFjdGVyKCkNCiAgICApDQogICkNCmBgYA0K
>>>>>>> remotes/origin/desync_analysis_all_files